Unity3d 着色器Shader的[Toggle]组件C#脚本控制问题解决方法
2023-09-27 14:27:29 时间
问题
在场景效果调出了一个模型的效果着色器,需要程序对着色器的一个属性进行动态修改,属性如下:
[Toggle(_USELINE_ON)] _UseLine("Use Line", Float) = 0
按我之前的认知,我就直接修改Float的数值为1或者0应该没问题:
//关闭
AniMat2.SetFloat("_UseLine", 0);
//打开
AniMat2.SetFloat("_UseLine", 1);
然而并没有效果,翻了半天网页也没查到结果,最后着色器生成的代码中找到了突破口。
解决方法
在着色器代码中看到很多类似代码段:
#ifdef _USELINE_ON
...
#else
...
#endif
[Toggle(_USELINE_ON)]是进行了与_USELINE_ON关联
这是进行了宏定义,那我动态的修改宏定义就可以完成控制,
方法就是这个=动态修改宏定义=
禁用此材质的本地着色器关键字。Material.DisableKeyword 方法:
为此材质启用本地着色器关键字。Material.EnableKeyword 方法:
这样就可以进行控制着色器的Toggle效果
//关闭
AniMat2.DisableKeyword("_USELINE_ON");
//打开
AniMat2.EnableKeyword("_USELINE_ON");
打包后无效
打包后该功能无效的问题,我是通过https://www.jianshu.com/p/32f6e8a217d6 解决的。
我是通过方法3修改Shader – multi_compile解决的。
相关文章
- C#:预处理器指令(转载16)
- C#阵列Array排序
- C#窗体设计OpenFileDialog控件的用法
- c#网络通信框架networkcomms内核解析之一 消息传送2
- 跳槽季:分享从事C#开发人员面试经验
- C# iis应用程序池控制:回收、启动、停止
- C#引用传递[转]
- .NET(C#) 扩展方法(Extension)
- C#字符串左边、右边或两边补齐字符的方法(PadLeft/PadRight)
- .Net(C#) CefSharp Chrome 浏览器控件后台执行Iframe中的Js代码的方法
- [C#] Linq To Objects - 如何操作文件目录
- Unity底层是如何处理C#的
- C# 获取打印机列表
- C#压缩图片
- 2019-11-29-C#-标准性能测试高级用法
- C# dotnet 获取整个局域网的 ip 地址
- C# 强转空会不会出现异常