Unity3D MaterialPropertyBlock 的一个坑
遇到的问题
项目中有个预制体里面包含了 SpriteRender、Spine 的 MeshRenderer ,以及粒子系统特效。需求是要求游戏里的这个预制体对象在某一种状态下半透明。使用 MaterialPropertyBlock
修改预制体对象中的一个 Sprite 的材质颜色时,该对象直接变成了全白显示。
产生问题的原因
Sprite 的着色器中的 _Color
属性使用了 [PerRendererData]
标签。因为 Unity 在内部使用 MaterialPropertyBlock
进行 Sprite 渲染,所以使用 MaterialPropertyBlock
发送一些 [PerRendererData] 时,必须首先使用 Renderer.GetMaterialPropertyBlock
获取默认的材质属性,然后在获取的 MaterialPropertyBlock
对象的基础上修改指定的某个属性,直接修改会覆盖掉 默认材质属性块的其他属性,如 _MainTex
等。
解决办法
1 | function SetAlpha(alpha) |
参考资料
- Unity3D PerRendererData