Unity | ShaderGUI
内容偏多 前看目录

效果
主要是使用的时候方便简单,
特效使用过程使用最频繁的是设置不同的叠加模式,所以制作4个大按钮。

这里只介绍方法,Shader不能提供
自定义着色器GUI(ShaderGUI)
有时候着色器中会包含一些数据类型,而内置的Unity材质编辑器无法很好表达这些数据类型。Unity提供了两种方法来使用户可以定义自己的方法来覆盖着色器属性的默认方式。用户可以通过这个功能来定义自定义控件和数据范围。
两种方法:
通过重新编写UnityEditor的ShaderGUI类来实现
直接使用MaterialPropertyDrawers来实现
其中,第一种方法类似于传统的unity编辑器扩展的方法,首先需要一个自定义编辑器的着色器,然后使用ShaderGUI类进行代码编写。
第二个部分是直接在Shader文件中使用Unity给我们设置好的一些预命令(MaterialProperty)来实现编辑器的扩展。Unity官方文档给出了详细的案例参考,这里就不详细展开,贴上官方的链接。

2. 创建GUI 文件
找到 Editor文件夹 创建一个测试的文件

定义测试的功能
回到Shader文件里,在底部增加我们的GUI文件

效果

可以看到目前是正确显示的。那我们正式开始编辑功能。
功能开发
1. 贴图显示
前实现显示贴图的功能,我们把Shader内的贴图属性,映射到GUI里。
效果

增加基础贴图颜色调整
扩展 TexturePropertySingleLine 的使用方法?
主要是处理,材质属性和GUI属性绑定

接下来显示贴图UV偏移和平铺
效果

我们希望平铺和偏移是在贴图下方点,不要和贴图同样开头。
使用 indentLevel++来控制缩进
效果

我们希望做一个功能,增加贴图才显示对应的属性。这样保持Shader界面的整洁。
这里有一个新的方法,判断贴图是否为空,
如果空不显示对应的属性,如果为空显示我们的属性条件。
这里把我们上面的贴图属性也优化一下。
使用判断 如果为空,就或者贴图,不为空绘制贴图的属性。
效果

这是俩种效果对比。

2. 整合资源
可以看到目前的输入类型资源有点多,有点乱,我们整理一下输入数据

GUIContent 类型的数据是绑定,
MaterialProperty 是获取到Shader的属性
那我们规划整合一下
把GUIContent 的属性放到一个类里,公开属性
调用的时候,使用这个类获取数据
这样我们就把 贴图整合到 4 个区域
3. 整合成4个区域

代码
扩展 m_MatEditor.RangeProperty(Alpha, "Alpha");
使用这样的方法可以减少代码。
效果

4. 法线贴图
上面可以在主贴图的右边增加颜色属性,目前想做法线增加一个控制法线强度的属性。 Unity 没有我们自定义一个方法。
定义属性
我们显示到主贴图里。
前自定义一个绘制UI的方法
调用法线贴图

效果


折叠功能
我们需要定义一个函数 绘制我们的折叠栏
1. 折叠属性
定义一个 bool类型 的变量,控制折叠。
使用 if控制显示
测试

2. 装饰栏
定义一个函数,绘制装饰栏
我们在调用这个函数
效果

3. 区域功能
如果我们在给我们的区域设置一个显示框,怎么处理。

只需要设置一个HelpBox

代码

基础设置功能
1. 按钮功能
定义一个按钮
定义Shader 属性的方法 设置材质的属性
在OnGUI 函数里调用
效果

2. 枚举按钮
这个Shader 是给特效使用的Shader ,特效经常使用的是设置材质的叠加模式。
所以我们制作一个设置叠加模式的按钮。
Shader 定义设置叠加模式
关联对应的属性

Shader就处理完 ,到GUI文件里定义属性,
绑定属性

前把我们的需要设置的属性暴露出来。
效果

开始处理按钮,
这是一个枚举类型的数据,我们需要转换成按钮使用。
前设置显示 文字,这里我们设置 4种,一种是基础,一种Alpha混合 叠加, 叠加忽略Alpha的
我们还需要把枚举类型转换成数值, 比如 0 普通, 1 混合 2 叠加 3 叠加(忽略Alpha)
定义一个函数,我们获取材质里的叠加模式。设置
定义一个函数,绘制我们的按钮,增加功能
把我们的功能增加到 OnGUI 函数里
效果


开关功能
1. 单开关功能
想给Shader增加一个开关的GUI怎么制作,
前定义一个开关变量,
使用 开关的属性,定义对应的数值,
效果

2. 开关有属性
如果有属性我们就使用if来判断, 需要显示的数据。
3. 宏开关
使用判断来材质是否开启宏开关
这是使用判断开启,
这是判断贴图是否开启,显示对应的宏开关。

示例 :开启宏
Shader 使用 2张贴图一张做Mask 使用。
Shader 定义变量
关键字显示
全代码
GUI脚本增加代码
我们需要获取到材质里的关键字,所以我们前想要定义一个材质类型
show函数 增加我们需要的变量
处理关键字逻辑
效果


全代码
资料
LWGUI船新版本 重新定义ShaderGUI - 知乎 (zhihu.com)
不会代码也能拥有!ShaderGUI_哔哩哔哩_bilibili
Unity - 脚本 API:编辑器图形用户界面 (unity3d.com)
小学二年级都会写的ShaderGUI - 知乎 (zhihu.com)