From 0dc138ea2f7ddd243c52d2b5dc1c7dc438f0eae4 Mon Sep 17 00:00:00 2001 From: NTG Date: Wed, 20 Aug 2025 20:15:49 +0900 Subject: [PATCH] =?UTF-8?q?uibutton=20=EC=9E=84=EC=8B=9C=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/_DDD/_Scripts/GameUi/UiButton.cs | 390 ++++++++++++++++++ Assets/_DDD/_Scripts/GameUi/UiButton.cs.meta | 3 + Assets/_DDD/_Scripts/GameUi/UiButtonTest.cs | 133 ++++++ .../_DDD/_Scripts/GameUi/UiButtonTest.cs.meta | 3 + 4 files changed, 529 insertions(+) create mode 100644 Assets/_DDD/_Scripts/GameUi/UiButton.cs create mode 100644 Assets/_DDD/_Scripts/GameUi/UiButton.cs.meta create mode 100644 Assets/_DDD/_Scripts/GameUi/UiButtonTest.cs create mode 100644 Assets/_DDD/_Scripts/GameUi/UiButtonTest.cs.meta diff --git a/Assets/_DDD/_Scripts/GameUi/UiButton.cs b/Assets/_DDD/_Scripts/GameUi/UiButton.cs new file mode 100644 index 000000000..77a2799b1 --- /dev/null +++ b/Assets/_DDD/_Scripts/GameUi/UiButton.cs @@ -0,0 +1,390 @@ +using System; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; +using UnityEngine.InputSystem; + +namespace DDD +{ + public enum ButtonState + { + Normal, + Highlighted, + Pressed, + Selected, + Disabled + } + + public class UiButton : MonoBehaviour, IInteractableUi, IPointerEnterHandler, IPointerExitHandler, + IPointerDownHandler, IPointerUpHandler, ISelectHandler, IDeselectHandler, ISubmitHandler + { + [Header("Button Components")] + [SerializeField] private Button _button; + [SerializeField] private Selectable _selectable; + + [Header("State Synchronization")] + [SerializeField] private bool _synchronizeStates = true; + [SerializeField] private bool _handleKeyboardInput = true; + [SerializeField] private bool _handleGamepadInput = true; + + [Header("Visual Feedback")] + [SerializeField] private Animator _animator; + [SerializeField] private Image _targetGraphic; + + [Header("Toggle Functionality")] + [SerializeField] private bool _useToggle = false; + + // State tracking + private bool _isPressed; + private bool _isHighlighted; + private bool _isSelected; + private bool _wasSelectedByKeyboard; + private bool _isToggled = false; + + // Events + public event Action OnClicked; + public event Action OnStateChanged; + + // Animation parameter hashes (if using Animator) + private readonly int _normalHash = Animator.StringToHash("Normal"); + private readonly int _highlightedHash = Animator.StringToHash("Highlighted"); + private readonly int _pressedHash = Animator.StringToHash("Pressed"); + private readonly int _selectedHash = Animator.StringToHash("Selected"); + private readonly int _disabledHash = Animator.StringToHash("Disabled"); + + private void Awake() + { + InitializeComponents(); + } + + private void OnEnable() + { + if (_button != null) + { + _button.onClick.AddListener(HandleButtonClick); + } + + UpdateVisualState(); + } + + private void OnDisable() + { + if (_button != null) + { + _button.onClick.RemoveListener(HandleButtonClick); + } + } + + private void Update() + { + HandleInputUpdate(); + } + + private void InitializeComponents() + { + // Get Button component if not assigned + if (_button == null) + { + _button = GetComponent