当前位置: 首页 > news >正文

Unity Image.overrideSprite - -冷夜

Unity Image.overrideSprite

核心机制

Image 组件实际上有两个控制图片的属性:

渲染逻辑:
overrideSprite != null → 渲染 overrideSprite
overrideSprite == null → 回退渲染 sprite(原始设置)

也就是说,overrideSprite 的优先级高于 sprite。只有‌在 overrideSprite 为 null 时,Image 才会使用你在 Inspector 里看到的那个 sprite‌。


与 sprite 的关键区别

特性spriteoverrideSprite
修改后是否标记场景脏
Inspector 是否可见 否(运行时动态设置)
用途 默认显示图片 临时覆盖图片

这个设计让 overrideSprite 特别适合‌临时状态切换‌——比如按钮悬停、道具冷却、状态图标更新等场景,修改它不会污染场景的序列化数据。


基本用法

1. 按钮状态切换

using UnityEngine;
using UnityEngine.UI;public class ButtonSpriteSwitcher : MonoBehaviour
{[SerializeField] private Sprite hoverSprite;[SerializeField] private Sprite pressedSprite;private Image image;void Awake(){image = GetComponent<Image>();}public void OnPointerEnter(){image.overrideSprite = hoverSprite;  // 悬停态
    }public void OnPointerExit(){image.overrideSprite = null;         // 恢复默认
    }public void OnPointerDown(){image.overrideSprite = pressedSprite; // 按下态
    }
}

 

2. 道具冷却/状态切换

public void SetCoolDown(bool isOnCooldown, Sprite cooldownIcon)
{// 冷却中显示灰色图标,否则恢复原图标image.overrideSprite = isOnCooldown ? cooldownIcon : null;
}

 

3. 空槽位与填充

public void SetEquipped(Sprite equippedIcon)
{// 有装备时显示装备图标,无装备时还原为空槽image.overrideSprite = equippedIcon != null ? equippedIcon : null;
}

 


在你的编辑器工具中如何使用

如果你在写自定义 EditorWindow 或 PropertyDrawer,经常需要直接操控 UI 控件。通过 SerializedObject找到 Image 组件后,同样可以操作 overrideSprite

// 在 PropertyDrawer 或 Editor 中
SerializedProperty imageProp = ...; // 拿到 Image 组件的引用
Image img = imageProp.objectReferenceValue as Image;
if (img != null)
{// 临时替换图片预览img.overrideSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/preview.png");
}

 


注意事项

  • 如果将 overrideSprite 设为一个‌完全不存在的 Sprite‌,Image 会直接清空渲染内容,不会回退到 sprite
  • overrideSprite 修改后立刻生效,无需调用额外刷新方法。
  • 它是‌纯运行时‌属性,不参与序列化,关闭 Unity 或退出运行模式后,Image 会自动恢复为 Inspector 中设置的 sprite
  • 如果需要‌永久替换‌图片(比如道具升级后换新图标),应该修改 sprite 而不是 overrideSprite

这个属性本质就是一个方便的"临时面具",让你在不改动原本数据的情况下,动态灵活地控制 UI 上渲染的内容。