Unity Image.overrideSprite
核心机制
Image 组件实际上有两个控制图片的属性:
渲染逻辑: overrideSprite != null → 渲染 overrideSprite overrideSprite == null → 回退渲染 sprite(原始设置) 也就是说,overrideSprite 的优先级高于 sprite。只有在 overrideSprite 为 null 时,Image 才会使用你在 Inspector 里看到的那个 sprite。
与 sprite 的关键区别
| 特性 | sprite | overrideSprite |
|---|---|---|
| 修改后是否标记场景脏 | 是 | 否 |
| 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 上渲染的内容。
