You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编辑模式更新材质属性报错,如何避免修改共享材质?

解决编辑模式下材质泄漏的问题

问题出在你隐式调用spriteRenderer.material时,Unity会自动实例化新材质,但编辑模式下这种隐式实例化会导致材质泄漏。要保留每个对象独立材质的需求,同时解决警告,你需要显式控制材质实例的创建,并在编辑模式下正确触发颜色更新。

修改后的脚本如下:

[ExecuteInEditMode]
public class ColorSwap : MonoBehaviour
{
    [SerializeField] private Color color;
    [SerializeField] private Material baseMaterial;

    private SpriteRenderer spriteRenderer;
    private Material instanceMaterial;

    private void OnEnable()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        // 显式创建材质实例,避免隐式实例化导致的警告
        if (baseMaterial != null && instanceMaterial == null)
        {
            instanceMaterial = new Material(baseMaterial);
            spriteRenderer.material = instanceMaterial;
        }
        UpdateColor();
    }

    private void OnValidate()
    {
        // 当Inspector中颜色或基础材质变化时,更新颜色
        UpdateColor();
    }

    private void UpdateColor()
    {
        if (spriteRenderer == null || instanceMaterial == null) return;
        instanceMaterial.SetColor("color", color);
        // 强制刷新编辑器视图
        #if UNITY_EDITOR
        UnityEditor.EditorUtility.SetDirty(spriteRenderer);
        #endif
    }

    private void OnDisable()
    {
        // 清理材质实例,避免泄漏
        if (instanceMaterial != null)
        {
            #if UNITY_EDITOR
            // 编辑模式下销毁材质
            DestroyImmediate(instanceMaterial);
            #else
            // 运行时销毁材质
            Destroy(instanceMaterial);
            #endif
            instanceMaterial = null;
        }
    }
}

关键修改点:

  • 新增baseMaterial字段,让你指定基础材质,避免直接操作sharedMaterial
  • 在OnEnable中显式创建材质实例,替换隐式调用material的行为
  • 使用OnValidate方法,在编辑模式下只要Inspector中的颜色或材质变化,就触发颜色更新,比Start更及时
  • 在OnDisable中清理材质实例,无论是编辑模式还是运行时都不会泄漏
  • 加入EditorUtility.SetDirty确保编辑器视图实时刷新效果

这样既保留了每个对象独立材质的需求,又解决了编辑模式下的材质泄漏警告,同时在编辑模式下能实时看到颜色变化效果。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:47:40