58 lines
1.7 KiB
C#
58 lines
1.7 KiB
C#
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<Toggle>();
|
|
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();
|
|
} |