From faf692673dd78adc85ff86a7a6c9e5e4bbbd67fd Mon Sep 17 00:00:00 2001 From: sharedacc520k Date: Sun, 22 Mar 2026 18:57:56 +0900 Subject: [PATCH] =?UTF-8?q?2026-03-22=20=EC=8A=A4=EC=99=91=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EA=B7=B8=EB=A3=B9=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/02_Scripts/UI/Menu/Buttons.meta | 8 ++ .../UI/Menu/{ => Buttons}/MenuButton.cs | 0 .../UI/Menu/{ => Buttons}/MenuButton.cs.meta | 0 Assets/02_Scripts/UI/Menu/SwapButton.cs | 53 --------- Assets/02_Scripts/UI/_Shared.meta | 8 ++ Assets/02_Scripts/UI/_Shared/Buttons.meta | 8 ++ .../UI/_Shared/Buttons/SwapButton.cs | 108 ++++++++++++++++++ .../Buttons}/SwapButton.cs.meta | 0 .../UI/_Shared/Buttons/SwapButtonGroup.cs | 48 ++++++++ .../_Shared/Buttons/SwapButtonGroup.cs.meta | 2 + 10 files changed, 182 insertions(+), 53 deletions(-) create mode 100644 Assets/02_Scripts/UI/Menu/Buttons.meta rename Assets/02_Scripts/UI/Menu/{ => Buttons}/MenuButton.cs (100%) rename Assets/02_Scripts/UI/Menu/{ => Buttons}/MenuButton.cs.meta (100%) delete mode 100644 Assets/02_Scripts/UI/Menu/SwapButton.cs create mode 100644 Assets/02_Scripts/UI/_Shared.meta create mode 100644 Assets/02_Scripts/UI/_Shared/Buttons.meta create mode 100644 Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs rename Assets/02_Scripts/UI/{Menu => _Shared/Buttons}/SwapButton.cs.meta (100%) create mode 100644 Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs create mode 100644 Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs.meta diff --git a/Assets/02_Scripts/UI/Menu/Buttons.meta b/Assets/02_Scripts/UI/Menu/Buttons.meta new file mode 100644 index 0000000..35630b4 --- /dev/null +++ b/Assets/02_Scripts/UI/Menu/Buttons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 47a94c1e8d71a2a46a650da8ae5d483c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/UI/Menu/MenuButton.cs b/Assets/02_Scripts/UI/Menu/Buttons/MenuButton.cs similarity index 100% rename from Assets/02_Scripts/UI/Menu/MenuButton.cs rename to Assets/02_Scripts/UI/Menu/Buttons/MenuButton.cs diff --git a/Assets/02_Scripts/UI/Menu/MenuButton.cs.meta b/Assets/02_Scripts/UI/Menu/Buttons/MenuButton.cs.meta similarity index 100% rename from Assets/02_Scripts/UI/Menu/MenuButton.cs.meta rename to Assets/02_Scripts/UI/Menu/Buttons/MenuButton.cs.meta diff --git a/Assets/02_Scripts/UI/Menu/SwapButton.cs b/Assets/02_Scripts/UI/Menu/SwapButton.cs deleted file mode 100644 index b9c98a1..0000000 --- a/Assets/02_Scripts/UI/Menu/SwapButton.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEngine; -using UnityEngine.Events; -using UnityEngine.EventSystems; -using UnityEngine.UI; - -[RequireComponent(typeof(Image))] -public class SwapButton : MonoBehaviour, IPointerClickHandler -{ - public Image TargetImage; - - public Sprite ASprite; - public UnityEvent ClickEventA = new UnityEvent(); - - public Sprite BSprite; - public UnityEvent ClickEventB = new UnityEvent(); - - [SerializeField] private bool _trueA_FalseB = true; - - public bool TrueA_FalseB - { - get => _trueA_FalseB; - set - { - _trueA_FalseB = value; - UpdateVisual(); // 값이 바뀔 때마다 자동으로 실행! - } - } - - private void Awake() - { - TargetImage = GetComponent(); - } - - public void OnPointerClick(PointerEventData eventData) - { - TrueA_FalseB = !TrueA_FalseB; - - if (TrueA_FalseB) - ClickEventA?.Invoke(); - else - ClickEventB?.Invoke(); - } - - private void OnValidate() - { - UpdateVisual(); - } - public void UpdateVisual() - { - if (TargetImage == null) return; - TargetImage.sprite = _trueA_FalseB ? ASprite : BSprite; - } -} diff --git a/Assets/02_Scripts/UI/_Shared.meta b/Assets/02_Scripts/UI/_Shared.meta new file mode 100644 index 0000000..1845cd6 --- /dev/null +++ b/Assets/02_Scripts/UI/_Shared.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3b73d1a7278784e438bd986a99ef3df2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/UI/_Shared/Buttons.meta b/Assets/02_Scripts/UI/_Shared/Buttons.meta new file mode 100644 index 0000000..8bc72a6 --- /dev/null +++ b/Assets/02_Scripts/UI/_Shared/Buttons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e80643c255c6374380bcd76c229008a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs new file mode 100644 index 0000000..85a46d2 --- /dev/null +++ b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs @@ -0,0 +1,108 @@ +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); + } +} diff --git a/Assets/02_Scripts/UI/Menu/SwapButton.cs.meta b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs.meta similarity index 100% rename from Assets/02_Scripts/UI/Menu/SwapButton.cs.meta rename to Assets/02_Scripts/UI/_Shared/Buttons/SwapButton.cs.meta diff --git a/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs new file mode 100644 index 0000000..82caa20 --- /dev/null +++ b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using UnityEngine; + +[ExecuteAlways] +public class SwapButtonGroup : MonoBehaviour +{ + // 현재 이 그룹에 등록된 모든 버튼들 + private List _registeredButtons = new List(); + + // 버튼이 활성화되거나 그룹이 할당될 때 호출됨 + public void RegisterButton(SwapButton button) + { + if (!_registeredButtons.Contains(button)) + { + _registeredButtons.Add(button); + + if (button.TrueA_FalseB == true) + { + foreach (SwapButton sb in _registeredButtons) + { + if (sb == button) continue; + + sb.TrueA_FalseB = false; + } + } + } + } + + // 버튼이 파괴되거나 그룹에서 빠질 때 호출됨 + public void UnregisterButton(SwapButton button) + { + if (_registeredButtons.Contains(button)) + { + _registeredButtons.Remove(button); + } + } + + // 특정 버튼이 선택되었을 때 나머지 버튼들을 모두 B(False)상태로 만듦 + public void OnButtonSelected(SwapButton selectedButton) + { + foreach (SwapButton button in _registeredButtons) + { + if (button == selectedButton) continue; + + button.TrueA_FalseB = false; + } + } +} diff --git a/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs.meta b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs.meta new file mode 100644 index 0000000..5d1298a --- /dev/null +++ b/Assets/02_Scripts/UI/_Shared/Buttons/SwapButtonGroup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7aa52a51f8c48046870a87acf509e27 \ No newline at end of file