chip-gameV3/Assets/Scripts/Settings/InputTestPanel.cs

115 lines
3.9 KiB
C#

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;
}
}