using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(Toggle))] public class ExclusiveToggleVisual : MonoBehaviour { [Header("選中時圖片")] [SerializeField] private Sprite onBackground; [SerializeField] private Sprite onCheckmark; [Header("未選中時圖片(留空 = 原始圖)")] [SerializeField] private Sprite offBackground; [SerializeField] private Sprite offCheckmark; private Toggle toggle; private Image bgImage; private Image checkImage; private Sprite origBg, origCheck; private void Awake() { toggle = GetComponent(); bgImage = toggle.targetGraphic as Image; checkImage = toggle.graphic as Image; // 儲存原始圖片(供 off 狀態使用) if (bgImage) origBg = bgImage.sprite; if (checkImage) origCheck = checkImage.sprite; // 關閉 UI 焦點干擾 toggle.transition = Selectable.Transition.None; toggle.navigation = new Navigation { mode = Navigation.Mode.None }; // 初始 + 監聽 SyncVisual(); toggle.onValueChanged.AddListener(_ => SyncVisual()); } private void SyncVisual() { bool isOn = toggle.isOn; // 背景圖 if (bgImage && onBackground) bgImage.sprite = isOn ? onBackground : (offBackground ?? origBg); // Checkmark 圖(僅在選中時顯示) if (checkImage) { if (onCheckmark) checkImage.sprite = isOn ? onCheckmark : (offCheckmark ?? origCheck); checkImage.enabled = isOn; } } // 外部可強制刷新(如動態換圖) public void Refresh() => SyncVisual(); }