[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换

上次更新已然四个月前,零零散散的工作结束,终于有时间写点东西记录一下~


实际使用中,经常会碰到同一个对象需要切换不同的材质,固然可以通过C#直接替换材质球。

或者在ShaderGraph中使用Comparison配合Branch实现切换,如下简单演示。

不过最近还发现了另一种实现方法,即是Keyword Enum,官方示释意如下。

如何创建?

使用方法也很简单,如下所示创建一个Enum。

这里只做最简单的颜色切换演示,实际只要把不同效果的终端链接给对应的enum项即可。

* 注意EntryName最好对应修改,后续会用到。

切换效果如下,不知道为什么OBS录不出下拉框,大家明白就好

如何使用?

除了以上手动切换,如果需要动态控制转变,则需要通过 Material.EnableKeyword()Material.DisableKeyword() 来启用或禁用 Shader 中的关键字,从而控制 Enum 的效果。

cs 复制代码
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 中的多个效果,灵活地根据游戏状态或其他条件切换不同的渲染效果。

相关推荐
凯尔3156 小时前
Unity简单涂料实现
unity·游戏引擎·图形渲染
刘步权9 小时前
KY-RTI分布仿真技术:第十三章 基于Unity的多语言三维态势仿真——以 Island Assault(夺岛突击)想定为例
unity·游戏引擎·仿真·态势·ky-rti·hla·rti
ellis197011 小时前
C#/Unity清理非托管资源
unity·c#
玖玥拾1 天前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
玖玥拾1 天前
Unity 3D 笔记(十七)Unity/C# Socket 网络笔记6
服务器·网络·unity·c#
玖玥拾2 天前
Unity 3D 笔记(十二)Unity/C# Socket 网络笔记1
网络·unity·c#
玖玥拾2 天前
Unity 3D 笔记(十五)Unity/C# Socket 网络笔记4
服务器·网络·unity·c#
xcLeigh3 天前
Unity基础:创建你的第一个游戏物体——Cube、Sphere与基本3D物体
游戏·3d·unity·教程
ellis19703 天前
C#异常相关关键字:Exceptions,throw,try,catch,finally
unity·c#
HH‘HH4 天前
Unity通过OPC UA工业协议连接工业设备实战指南
unity·游戏引擎