问题
在场景效果调出了一个模型的效果着色器,需要程序对着色器的一个属性进行动态修改,属性如下:
[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解决的。