思路
Unity 中,用代码设置材质,实质上是用代码修改该材质连接的 Shader 内变量的值。编写的 Shader 文件好比一个类,而材质及其连接的 Shader 的当前配置则相当于该类的一个实例。
Shader 基础
Shader 内常见的变量类型:
Shader 中的变量类型 | 说明 |
---|---|
Int | 整数 |
Float 或用 Range(min, max) 表示 | 浮点 |
Color | 颜色 |
2D | 贴图 |
Vector4 | 四维向量 |
仅列举在 Inspector 面板中常用者。
特别需要注意的是,Shader 内变量名一定以"_"开头。
如何用代码设置
用代码设置材质中的某变量时,需要先查看该材质的 Shader 代码,以找到其类型和变量名(不一定是 Inspector 面板上显示的显示名)。
例1:
打开 Shader 代码发现:
_BumpScale("Scale", Float) = 1.0
//_变量名("显示名", 类型) = 初值
所以在 C# 中应该:
Material mat = gameObject.GetComponent<MeshRenderer>().material; // 获取材质
mat.SetFloat("_BumpScale", 0.5); // 设置 Shader 中某 Float 变量的值
//mat.SetFloat("_变量名", 新值);
如上以 Float 为例,找到需要修改的变量 _BumpScale
,并设置新值 0.5
。
对其他类型,类似地换用 mat.SetInt()
、mat.SetColor()
等方法即可;
获取值时可以用 mat.GetInt()
、mat.GetColor()
等方法即可。
例2:
再附一个用代码修改物体颜色的例子。物体就直接创建一个默认的物体,它带有默认材质,Shader 为 Standard。这里就以修改 Inspector 面板上 Albedo 那处的颜色为例。
打开 Standard.Shader 代码发现:
// ...
_Color("Color", Color) = (1,1,1,1)
_MainTex("Albedo", 2D) = "white" {}
//_变量名("显示名", 类型) = 初值
// ...
所以在 C# 中应该:
Material mat = gameObject.GetComponent<MeshRenderer>().material; // 获取材质
mat.SetColor("_Color", new Color(1, 0, 0, 1)); // 设置 Shader 中某 Color 变量的值
// mat.SetTexture("_MainTex", tex); // 当然如果有需要也可设置贴图
//mat.SetFloat("_变量名", 新值);
关于 Shader
本文仅涉及最基础的 Shader 知识,对于 Shader 中涉及的某些具体语法细节也不必过度追究,对 Shader 一无所知也没问题,直接拿来用即可。
想借此系统地入门 Shader?推荐参考以下资料:
《零基础入门Unity Shader(1-10)》taecg 游戏蛮牛