zoukankan      html  css  js  c++  java
  • 关于Unity中的模型描边与Shader切换(专题二)

    模型描边

    1: LOL里面的模型描边效果,点击防御塔会有描边的效果,被攻击的时候模型也要描边凸显一下
    2: 网上可以找到模型描边的Shader,可以直接下载使用,一组第三方的Shader, 帮我们解决了模型描边的问题,叫Toony(第65)

    Shader切换

    1.被攻击的时候模型描边凸显一下,不被攻击的时候就描边隐藏,变成正常模型的样子

    2.需要一个带模型描边的Shader和一个不带模型描边的Shader

    代码里面切换Shader

    材质是Shader的使用者,模型贴材质,材质决定了是用哪种Shader来进行绘制和渲染,所以切换Shader就是要先关联材质到Public

    1: 关联要切换Shader的材质
    2: 代码加载对应的Shader: Shader.Find(“Shader的名字”);,不是Shader的路径,这个名字可以打开对应的Shader在第一行就是
    3: 切换材质对应的Shader; Matrix.shader = Shader
    4: 将最常用的Shader, 放到Unity的Always Include里 --> 优化检查
    5: Edit--> ProjectSetting --> Graphics --> Always-included Shaders


      让这些Shader很重要,在开始的时候加载,常驻内存;

    Shader切换实例

    1.创建Unity项目和文件目录,保存场景

    2.创建一个Shaders文件夹,把下载的Toony文件夹(第65)复制进去,Toony里面有4个shader。在Resources文件夹下面创建一个People文件夹,把人物模型文件复制进去(People.FBX和People.png)(第65)

    3.点击People模型,Rig---->Animation Type设置为Legacy旧版动画模式---->Apply

    4.进入Resources/Material,关联好材质球的纹理贴图,点击模型Animations---->Wrap Mode---->Loop---->Apply设置动画循环播放

    5.把People拖进场景,设置它的材质的Shader---->Toon---->Basic,颜色设置为255,255,255,255,这是正常状态

     

     设置它的材质的Shader---->Toon---->Basic Outline,Outline Color描边颜色设置为红色,这是有描边的状态,Outline width可以设置描边粗细

     

    6.创建一个脚本Actor.cs挂载在People模型下来切换shader

     打开Actor.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Actor : MonoBehaviour {
        public Material mat;//关联模型的材质,才能对它的Shader进行切换
    
        //定义两个静态变量来保存Shader
        static Shader normal=null;//正常状态的shader
        static Shader outline=null;//描边状态的shader
    
        private bool is_normal = false;//判断当前是否处于正常状态
    
        Shader get_normal()
        {
            if (normal)//当它第一次为空的时候,我们就创建一个,后面不为空就直接使用,但是这样优化还不够
            {
                return normal;
    
            }
    
            //之所以用静态变量,是因为在查找Shader的时候,也会编译shader包括生成GLprogam,生成一个程序放进去,是有开销的
            //如果Shader没有人使用了,或者找到了Shader不使用,也会被游戏引擎卸载掉,如果设置为常驻内存就不会
            normal = Shader.Find("Toon/Basic");
            return normal;
        }
    
        Shader get_outline()
        {
            if (outline)
            {
                return outline;
    
            }
            outline = Shader.Find("Toon/Basic Outline");
            return outline;
        }
    
    
        // Use this for initialization
        void Start () {
            this.mat.shader = this.get_normal();
            is_normal = true;
    
            //调用的函数,3秒后开始调用,每1秒调用1次
            this.InvokeRepeating("change_shader",3.0f,1.0f);
    
        }
    
        //切换shader
        void change_shader()
        {
            if (this.is_normal)
            {
                //切换到描边状态
                this.mat.shader = this.get_outline();
                is_normal = false;
            }
            else
            {
                //切换到正常状态
                this.mat.shader = this.get_normal();
                is_normal = true;
            }
        }
    
    
        // Update is called once per frame
        void Update () {
            
        }
    }

    7.运行,发现3秒后开始切换,每隔1秒切换一次,但是其实还没有做完,还可以优化

    //在运行的时候,去加载Shader,会消耗CPU,解决方法就是预先把Shader加载好
    //Unity有一个机制,就是常用的Shader设置告诉它,它会帮你把这个Shader常驻内存
    //常用的Shader,在游戏启动的时候预先加载好,就算Shader没有用了,也会常住内存

    //启动的时候和运行的时候是不同的阶段

    Edit---->ProjectSetting---->Graphics---->Always-included Shaders---->增加Size,关联新的Shader

    8.现在才算完成

  • 相关阅读:
    响应式后台管理模版
    js数组、对象、正则
    react视频入门
    JSON.parse() JSON.stringify() eval() jQuery.parseJSON() 的区别
    网站生产app的一些网址
    一个博客总结的css常见的兼容性问题
    Js倒计时
    移动端好的博客
    day_4(element对象、node的属性、操作dom树)
    js的常用对象及方法使用
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7286792.html
Copyright © 2011-2022 走看看