答案 0 :(得分:4)
为了优化渲染,当两个相同的对象使用相同的材质或网格时,它实际上是使用的相同实例。简单地说,你的两只鲸鱼使用相同的材料。这是为了保存绘制调用。
因此,当您更改它时,它会发生变化。
解决方案是复制材料并将其分配给其中一个。现在你可以改变一个而不影响另一个。您还添加了一个额外的绘制调用。
答案 1 :(得分:3)
作为复制材料的替代解决方案(防止鲸鱼同时进行批处理!),您可以使用MaterialPropertyBlock
s。
它们通常非常易于使用。在新脚本中,您创建一个MaterialPropertyBlock,将颜色设置为您希望对象拥有的颜色,并将MaterialPropertyBlock指定给对象的渲染器。
MaterialPropertyBlock.SetColor()有一个有效的例子,虽然不需要Draw调用(它是一个过度设计的例子)。这就足够了:
Start() {
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
mpb.SetColor("_MainColor", new Color(1,0,0));
gameObject.GetComponent<MeshRenderer>().SetPropertyBlock(mpb);
}
结果:
从长远来看,这会变得更有效率,因为你可以使用着色器做一些非常复杂的事情,让每个对象使用相同的单一材质,但是它们都有自己独特的外观,并且渲染速度并不高。受苦。 硬件正在计算着色器中要调整的属性的名称。
当然,结果仅在播放模式下运行时显示(除非您使用[ExecuteInEditMode]
标记该类。)