最近遇到一个问题: 修改某个Meterial的shader会导致引用到该Meterial的对象也被影响了。
这个结果跟官方文档说明不同,网上也有很多文章详细解释到,例如:
《Mesh中 material 和 sharedMaterial 的区别及内部实现的推断》
《Unity3D Mesh小课堂(四)MeshRenderer的material和sharedMaterial》
检查下代码才发现,我修改的是Image的Meterial,而Image不是继承Renderer,它只有material,没有sharedMaterial。
翻查UI.Image源码,发现它的material的get,set是这样
public override Material material
{
get
{
if (m_Material != null)
return m_Material;
if (activeSprite && activeSprite.associatedAlphaSplitTexture != null)
return defaultETC1GraphicMaterial;
return defaultMaterial;
}
set
{
base.material = value;
}
}
那这样就能解释了问题了:Image内部并不会去Instance material。
可以理解成 修改Image的material参数 就像 修改Renderer的sharedMaterial参数 一样,一改就全改了。