Unity3d 着色器Shader的[Toggle]组件C#脚本控制问题解决方法

问题

在场景效果调出了一个模型的效果着色器,需要程序对着色器的一个属性进行动态修改,属性如下:

[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解决的。

猜你喜欢

转载自blog.csdn.net/qq_33789001/article/details/124102179