本教程讲述在Unity 5中,如何为着色器和材质创建自定义检视面板。

161900abvva020v1c0zcv2.png
而直接点击Unity的 Assets > Create > Shader > Standard Surface Shader新建Standard Surface Shader,检视面板会如下显示:

161900tbvbb022bboal09a.png
尽管两个着色器存在差异,但这并非造成检视面板大相径庭的原因。Default Standard Shader会附带StandardShaderGUI脚本,它会以新的自定义检视面板来替换默认的检视面板。在Unity 5中,自定义材质检视面板是通过ShaderGUI 类来完成的。

第一步 创建

自定义材质检视面板不是通过修改着色器本身来实现的,而是将所有需要实现自定义行为的代码写在继承自ShaderGUI的脚本。目标着色器需要做的修改就是添加一个指向上述脚本的引用。这里将改脚本命名为CustomShaderGUI:
[C#] 纯文本查看 复制代码Shader Custom/NewSurfaceShader { Properties { ... } SubShader { ... } CustomEditor CustomShaderGUI }
任何继承自ShaderGUI的类都可以用来定义材质检视面板的功能。Unity会调用OnGUI方法来绘制检视面板。OnGUI接收两个参数。一个是MaterialEditor,代表正在使用的材质;另一个是MaterialProperty数组。数组的每个元素对应于着色器定义的每个属性。
[C#] 纯文本查看 复制代码using UnityEngine; using UnityEditor; public class CustomShaderGUI : ShaderGUI { public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) { base.OnGUI(materialEditor, properties); } }
OnGUI的基本功能是在检视面板中绘制各个属性。ShaderGUI 同时会这些属性的变化,并将结果传送给材质。

CustomShaderGUI 必须被放在“Editor”文件夹下才可正常使用。这个文件夹可以放在任何目录,项目中也可以出现多个叫做“Editor”的文件夹。当您编译游戏时,Unity只会包含那些必要的库文件。所有用来扩展编辑器的类都不会引入最终发布的游戏中。这意味着使用了using UnityEditor的脚本在构建游戏时不会被编译,这是因为命名空间UnityEditor的脚本,只在Unity编辑器环境中有效。因此有多个Editor文件夹也没关系。

第二步 查找属性

理解OnGUI 工作原理的第一步,就是用一个更简单的实现版本来替换它。遍历所有属性,使用MaterialEditor.ShaderProperty在检视面板中显示这些属性。
[C#] 纯文本查看 复制代码public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties) { foreach (MaterialProperty property in properties) materialEditor.ShaderProperty(property, property.displayName); }
这段代码作用是获取了着色器定义的所有属性,并将其放入检视面板。这与OnGUI的效果相同,但仍有一些细微差别。例如,OnGUI不会绘制带有[HideInInspector]的属性。而上面的代码段则会绘制所有属性。

使用ShaderGUI,可以绘制出一些您需要的属性。Unity提供了查找特定属性,获取或修改其值的方法。假设着色器有一个属性名为_Color,可以通过FindProperty从properties数组中获取该属性。
MaterialProperty colorProperty = ShaderGUI.FindProperty(_Color, properties);

通过前文的讲述,我们现在可以使用OnGUI或ShaderProperty两种方式在检视面板中绘制属性。

第三步 切换按钮

ShaderGUI最常见的用法是选择性地隐藏或显示某些属性。本教程中假定的着色器有两种模式。第一种使用纯色;第二种使用两个颜色作为渐变色。根据所选的模式不同,相应在检视面板的显示也会发生变化。

首先记录开发者的选择。可以在着色器中添加一个切换按钮来实现。
[C#] 纯文本查看 复制代码Properties { ... [Toggle] _UseTwoColors(Use two colors?, Int) = 0 _Color1(Color 1, Color) = (1,0,0,1) _Color2(Color 2, Color) = (0,0,1,1) ... }
默认情况下,材质检视面板所显示的画面如下:

161900lybj2yxvbbbezwhq.png
Unity的着色器不支持布尔类型的属性;_UseTwoColors是一个整型变量。[Toggle]属性确保了它的取值只能为0或1,检视面板会自动绘制一个复选框。

第四步 条件

我们设计在勾选_UseTwoColors后,才显示第二个颜色。实现代码如下:
[C#] 纯文本查看 复制代码MaterialProperty _MainTex = ShaderGUI.FindProperty(_MainTex, properties); MaterialProperty _UseTwoColors = ShaderGUI.FindProperty(_UseTwoColors, properties); MaterialProperty _Color1 = ShaderGUI.FindProperty(_Color1, properties); materialEditor.ShaderProperty(_MainTex, _MainTex.displayName); materialEditor.ShaderProperty(_UseTwoColors, _UseTwoColors.displayName); materialEditor.ShaderProperty(_Color1, _Color1.displayName); if (_UseTwoColors.floatValue == 1) { MaterialProperty _Color2 = ShaderGUI.FindProperty(_Color2, properties); materialEditor.ShaderProperty(_Color2, _Color2.displayName); }
161901q3fwldp0sqxwjfu3.gif
这段代码的作用非常明显。首先,查找所有需要的属性,然后在检视面板中绘制前三个属性。最后,根据切换按钮的值来决定是否绘制第二个颜色。

总结

本教程简单地描述了如何自定义材质的检视面板。尽管高效,但仍有几个细节需要注意。Unity允许一个着色器有不同的变体,它们可以轻易地交换。在本文的例子中,我们可以创建一个着色器的两个变体,并且根据复选框的值来选择正确的那个。

原文连接:ShaderGUI: Custom Material Inspectors in Unity 5+
原文作者:Alan Zucconi
感谢Unity官方翻译组成员“Swcha”对本文翻译所做的贡献。
转载请注明来源:Unity官方中文社区(forum.china.unity3d.com)。请勿私自更改任何版权说明信息。
Unity, 着色器, shader锐亚教育

锐亚教育 锐亚科技 unity unity教程