【发布时间】:2018-03-01 23:52:47
【问题描述】:
【问题讨论】:
【问题讨论】:
为了优化渲染,当两个相同的对象使用相同的材质或网格时,实际上使用的是相同的实例。简单地说,你的两条鲸鱼使用的是相同的材料。这是为了节省绘图调用。
所以当你改变它时,它会同时改变。
解决方案是复制材料并将其分配给其中之一。现在您可以更改一个而不影响另一个。您还添加了一个额外的绘图调用。
【讨论】:
您可以使用MaterialPropertyBlocks 作为复制材料的替代解决方案(防止两条鲸鱼进行批处理!)。
它们通常很容易使用。在新脚本中,您创建一个 MaterialPropertyBlock,将颜色设置为您希望对象具有的颜色,并将 MaterialPropertyBlock 分配给对象的渲染器。
MaterialPropertyBlock.SetColor() 有一个工作示例,尽管不需要 Draw 调用(这是一个过度设计的示例)。这就足够了:
Start() {
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
mpb.SetColor("_MainColor", new Color(1,0,0));
gameObject.GetComponent<MeshRenderer>().SetPropertyBlock(mpb);
}
结果:
从长远来看,这最终会更有效率,因为您可以使用着色器做一些非常复杂的事情,让每个对象都使用相同的单一材质,但它们都有自己独特的外观,而且渲染速度不会遭受。 困难的部分是找出要调整的着色器中属性的名称。
当然,只有在播放模式下运行时才会显示结果(除非您使用[ExecuteInEditMode] 标记类)。
【讨论】: