using System; using DG.Tweening; using UnityEngine; using UnityEngine.UI; public sealed class InputTestPanel : MonoBehaviour, IControlable { public event Action OnClosed; [SerializeField] private CanvasGroup _canvasGroup; [SerializeField] private RectTransform _leftJoystickHandle; [SerializeField] private RectTransform _rightJoystickHandle; [SerializeField] private Image _leftActionButton; [SerializeField] private Image _rightActionButton; [SerializeField] private Image _serviceButton; [SerializeField] private RectTransform _exitProgressFill; [SerializeField] private float _joystickTravel = 80f; [SerializeField] private float _exitHoldDuration = 1f; [SerializeField] private float _fadeDuration = 0.25f; [SerializeField] private Color _idleColor = new Color(0.25f, 0.25f, 0.28f, 1f); [SerializeField] private Color _pressedColor = new Color(1f, 0.85f, 0.1f, 1f); private Tween _fadeTween; private float _exitHoldTime; private bool _isClosing; public bool ControlsEnabled { get; set; } private void OnDisable() { _fadeTween?.Kill(); _fadeTween = null; ControlsEnabled = false; } public void Open() { _fadeTween?.Kill(); transform.SetAsLastSibling(); _canvasGroup.alpha = 0f; _canvasGroup.blocksRaycasts = true; _exitHoldTime = 0f; _isClosing = false; ControlsEnabled = true; ResetVisuals(); _fadeTween = _canvasGroup.DOFade(1f, _fadeDuration).SetEase(Ease.OutCubic).SetUpdate(true); _fadeTween.PlayForward(); } public void UpdateControls() { Vector2Int leftAxis = In.GetAxis(JoystickSide.Left, InteractMode.Continious); Vector2Int rightAxis = In.GetAxis(JoystickSide.Right, InteractMode.Continious); bool leftActionPressed = In.GetAction(JoystickSide.Left, InteractMode.Continious); bool rightActionPressed = In.GetAction(JoystickSide.Right, InteractMode.Continious); _leftJoystickHandle.anchoredPosition = (Vector2)leftAxis * _joystickTravel; _rightJoystickHandle.anchoredPosition = (Vector2)rightAxis * _joystickTravel; SetButtonState(_leftActionButton, leftActionPressed); SetButtonState(_rightActionButton, rightActionPressed); SetButtonState(_serviceButton, In.GetService()); bool exitButtonsHeld = leftActionPressed && rightActionPressed; _exitHoldTime = exitButtonsHeld ? Mathf.Min(_exitHoldTime + Time.unscaledDeltaTime, _exitHoldDuration) : 0f; SetExitProgress(_exitHoldTime / _exitHoldDuration); if (_exitHoldTime >= _exitHoldDuration) Close(); } private void Close() { if (_isClosing) return; _isClosing = true; ControlsEnabled = false; _fadeTween?.Kill(); _fadeTween = _canvasGroup.DOFade(0f, _fadeDuration).SetEase(Ease.InCubic).SetUpdate(true); _fadeTween.OnComplete(() => { _canvasGroup.blocksRaycasts = false; OnClosed?.Invoke(); }); _fadeTween.PlayForward(); } private void ResetVisuals() { _leftJoystickHandle.anchoredPosition = Vector2.zero; _rightJoystickHandle.anchoredPosition = Vector2.zero; SetButtonState(_leftActionButton, false); SetButtonState(_rightActionButton, false); SetButtonState(_serviceButton, false); SetExitProgress(0f); } private void SetButtonState(Image button, bool pressed) { button.color = pressed ? _pressedColor : _idleColor; button.rectTransform.localScale = pressed ? Vector3.one * 0.92f : Vector3.one; } private void SetExitProgress(float progress) { Vector2 anchorMax = _exitProgressFill.anchorMax; anchorMax.x = Mathf.Clamp01(progress); _exitProgressFill.anchorMax = anchorMax; } }