关于Unity Material的修改

最近遇到一个问题: 修改某个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参数 一样,一改就全改了。

你可能感兴趣的:(关于Unity Material的修改)