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