Unity中使用C#设置MaterialPropertyBlock颜色透明度的问题及解决方案
解决Unity中MaterialPropertyBlock无法调整颜色透明度的问题
问题回顾
你尝试用MaterialPropertyBlock修改网格颜色,想要实现红色的淡入淡出渐变效果,但接连遇到了两个困扰:
- 初始代码设置
Color.red后,颜色始终保持100%强度,完全没法调整透明度 - 尝试在
Color构造函数里手动设置alpha值(比如new Color(0, 255, 0, 0f)),结果颜色还是以100%强度显示,透明度完全没生效
关键原因排查
这个问题本质是着色器属性不匹配——你代码里调用的_Main属性,并不是当前材质所使用的着色器中控制颜色透明度的正确属性。不同类型的着色器(内置标准着色器、自定义着色器、第三方着色器)会用不同的属性名来管理颜色和透明度,比如Unity内置的Standard着色器,主颜色(含透明度)的属性名是_Color,而非_Main。
另外还要纠正一个小细节:Color构造函数的参数是0-1范围的浮点数,不是0-255的整数!你之前写的new Color(0,255,0,0f)里的绿色值255会被自动限制为1,这也是导致颜色显示不符合预期的一个隐藏原因。
正确实现代码
根据你最终排查的结论,只需要调整代码对应到着色器的正确属性即可。比如如果你的着色器用_Color控制颜色和透明度,代码应该这样写:
mpb = new MaterialPropertyBlock(); // 使用0-1范围的数值,alpha设为0.5就是半透明状态 Color color = new Color(1f, 0f, 0f, 0.5f); // 半透明红色 mpb.SetColor("_Color", color); // 替换成你当前着色器实际使用的属性名 _meshRenderer.SetPropertyBlock(mpb);
通用解决方案总结
通过MaterialPropertyBlock设置颜色及透明度的核心原则是:
- 先确认当前材质所使用的着色器中,控制主颜色/透明度的属性名称(可以查看Shader代码,或者在材质面板的Inspector里 hover 属性名查看提示)
- 代码中
SetColor的参数必须和着色器的属性名完全一致 - 牢记
Color构造函数的参数范围是0-1的浮点数,不要误用0-255的整数
内容的提问来源于stack exchange,提问作者Aggressor




