[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换
上次更新已然四个月前,零零散散的工作结束,终于有时间写点东西记录一下~
实际使用中,经常会碰到同一个对象需要切换不同的材质,固然可以通过C#直接替换材质球。
或者在ShaderGraph中使用Comparison配合Branch实现切换,如下简单演示。
不过最近还发现了另一种实现方法,即是Keyword Enum,官方示释意如下。
如何创建?
使用方法也很简单,如下所示创建一个Enum。
这里只做最简单的颜色切换演示,实际只要把不同效果的终端链接给对应的enum项即可。
* 注意EntryName最好对应修改,后续会用到。
切换效果如下,不知道为什么OBS录不出下拉框,大家明白就好
如何使用?
除了以上手动切换,如果需要动态控制转变,则需要通过 Material.EnableKeyword()
和 Material.DisableKeyword()
来启用或禁用 Shader 中的关键字,从而控制 Enum 的效果。
using UnityEngine;
public class KeywordEnum : MonoBehaviour
{
public enum EnumTest
{
red,
blue,
green
}
public EnumTest enumTest;
public Material material;
void Update()
{
// 禁用所有相关关键字,避免叠加
material.DisableKeyword("_ENUMCOLOR_RED");
material.DisableKeyword("_ENUMCOLOR_BLUE");
material.DisableKeyword("_ENUMCOLOR_GREEN");
switch (enumTest)
{
//应用对应效果
case EnumTest.red:
material.EnableKeyword("_ENUMCOLOR_RED");
break;
case EnumTest.blue:
material.EnableKeyword("_ENUMCOLOR_BLUE");
break;
case EnumTest.green:
material.EnableKeyword("_ENUMCOLOR_GREEN");
break;
}
}
}
其中"_ENUMCOLOR_RED"这个名字取自 _枚举名_枚举变量名 。
如果不清楚的话,可以切换至Debug模式进行复制。
* 注意代码中DisableKeyword()
一定要有,不然就会出现效果叠加而不显示。
最终效果和手动切换也没差,就不录演示了。
通过这种方式就可以用 Enum 来控制 Shader 中的多个效果,灵活地根据游戏状态或其他条件切换不同的渲染效果。