using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; [ExecuteAlways] [RequireComponent(typeof(Image))] public class SwapButton : MonoBehaviour, IPointerClickHandler { [SerializeField] private SwapButtonGroup _group; public SwapButtonGroup Group { get => _group; set { if (_group != null) _group.UnregisterButton(this); _group = value; if (_group != null) _group.RegisterButton(this); } } [Space(10)] public Image TargetImage; [Space(10)] public Sprite TrueSprite; public UnityEvent TrueEvent = new UnityEvent(); public Sprite FalseSprite; public UnityEvent FalseEvent = new UnityEvent(); [SerializeField] private bool _trueA_FalseB = true; public bool TrueA_FalseB { get => _trueA_FalseB; set { if (_trueA_FalseB == value) return; _trueA_FalseB = value; UpdateVisual(); // 값이 바뀔 때마다 자동으로 실행! if (_trueA_FalseB && _group != null) { _group.OnButtonSelected(this); } } } private void Awake() { TargetImage = GetComponent(); // 시작할 때 그룹이 설정되어 있다면 등록 if (_group != null) _group.RegisterButton(this); } private void Start() { UpdateVisual(); } public void OnPointerClick(PointerEventData eventData) { if (_group != null) { // 라디오 버튼 모드: 이미 선택된 건 다시 눌러도 무반응 if (_trueA_FalseB) return; TrueA_FalseB = true; // 나를 True 상태로 TrueEvent?.Invoke(); } else { // 그룹이 없으면 기존처럼 토글 TrueA_FalseB = !TrueA_FalseB; if (TrueA_FalseB) TrueEvent?.Invoke(); else FalseEvent?.Invoke(); } } private void OnValidate() { UpdateVisual(); if (_trueA_FalseB && _group != null) { _group.OnButtonSelected(this); } } public void UpdateVisual() { if (TargetImage == null) return; TargetImage.sprite = _trueA_FalseB ? TrueSprite : FalseSprite; } private void OnDestroy() { // 오브젝트 삭제 시 그룹에서 해제 if (_group != null) _group.UnregisterButton(this); } }