使用ShaderGUI在Unity 5中自定义材质检视面板

2016年11月28日 15:57 0 点赞 2 评论 更新于 2025-11-21 20:53

本教程将详细介绍在Unity 5中,如何为着色器和材质创建自定义检视面板。本教程使用的Shader GUI适用于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,可以通过 FindPropertyproperties 数组中获取该属性。

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

第三步:切换按钮

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

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

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

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

第四步:条件判断

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

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

总结

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

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章