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

泰课在线

本教程使用的ShaderGUI针对Unity 5.0及以上版本,Unity 4.x需要使用MaterialEditor(现已弃用)。

引言
在Unity中新建材质后,可以通过检视面板(Inspector)修改其所有属性。默认情况下,Unity会提供材质所用的着色器在“Properties”部分定义的所有字段。值得注意的是,这条规则对Standard Shader是无效的。Standard Shader的检视面板中可以看到大量的选项和自定义菜单,如下图:

泰课在线

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

泰课在线

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

第一步 创建
自定义材质检视面板不是通过修改着色器本身来实现的,而是将所有需要实现自定义行为的代码,写在继承自ShaderGUI的脚本。目标着色器需要做的修改就是添加一个指向上述脚本的引用。这里将改脚本命名为CustomShaderGUI。脚本代码请点击[阅读原文]查看。

任何继承自ShaderGUI的类都可以用来定义材质检视面板的功能。Unity会调用OnGUI方法来绘制检视面板。OnGUI接收两个参数。一个是MaterialEditor,代表正在使用的材质;另一个是MaterialProperty数组。数组的每个元素对应于着色器定义的每个属性。

OnGUI的基本功能是在检视面板中绘制各个属性。ShaderGUI同时会监听这些属性的变化,并将结果传送给材质。

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

第二步 查找属性
理解OnGUI工作原理的第一步,就是用一个更简单的实现版本来替换它。遍历所有属性,使用MaterialEditor.ShaderProperty在检视面板中显示这些属性。

获取着色器定义的所有属性,并将其放入检视面板。这与OnGUI的效果相同,但仍有一些细微差别。例如,OnGUI不会绘制带有[HideInInspector]的属性。而MaterialEditor.ShaderProperty则会绘制所有属性。

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

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

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

首先记录开发者的选择。可以使用[Toggle]属性在着色器中添加一个切换按钮来实现。点击[阅读原文]查看代码。

默认情况下,材质检视面板所显示的画面如下:

泰课在线

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

第四步 条件
我们设计在勾选_UseTwoColors后,才显示第二个颜色。

泰课在线

这段代码的作用非常明显。首先,查找所有需要的属性,然后在检视面板中绘制前三个属性。最后,根据切换按钮的值来决定是否绘制第二个颜色。

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