编辑模式更新材质属性报错,如何避免修改共享材质?
解决编辑模式下材质泄漏的问题
问题出在你隐式调用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
相关产品推荐
相关产品推荐

