Petition-to-the-Gods-V3/Assets/Scripts/ExclusiveToggleVisual.cs
2025-11-18 14:54:11 +08:00

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();
}