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