博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Unity中的模型描边与Shader切换(专题二)
阅读量:6269 次
发布时间:2019-06-22

本文共 2842 字,大约阅读时间需要 9 分钟。

模型描边

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.现在才算完成

转载地址:http://ijppa.baihongyu.com/

你可能感兴趣的文章
C# 获取文件名及扩展名
查看>>
Web安全学习计划
查看>>
输出有序数组的连续序列范围
查看>>
zinnia项目功能分析
查看>>
windows cmd for paramiko
查看>>
SQL经典面试题集锦
查看>>
View学习(一)-DecorView,measureSpec与LayoutParams
查看>>
色彩力量!21款你应该知道的优秀品牌设计
查看>>
SDUT 3503 有两个正整数,求N!的K进制的位数
查看>>
【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径...
查看>>
Redis常用命令速查 <第二篇>
查看>>
CSS规范
查看>>
使用FastDateFormat来代替JDK自带的DateFormat
查看>>
Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
查看>>
Android源代码解析之(三)--&gt;异步任务AsyncTask
查看>>
(zhuan) 自然语言处理中的Attention Model:是什么及为什么
查看>>
C#中使用RabbitMQ收发队列消息
查看>>
Hadoop1.2.1 全然分布式集群搭建实操笔记
查看>>
第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求...
查看>>
MVC总结--MVC简单介绍以及和WebForm差别
查看>>