chip-gameV3/Assets/Scripts/UI/Menu/MenuAnimator.cs

62 lines
1.9 KiB
C#

using DG.Tweening;
using System;
using UnityEngine;
[Serializable]
public class MenuAnimator
{
[SerializeField] private RectTransform _leftPanel;
[SerializeField] private RectTransform _rightPanel;
[SerializeField] public float _duration;
[SerializeField] private Ease _ease;
private float _leftOpenedPosition;
private float _rightOpenedPosition;
public void Initialize()
{
_leftOpenedPosition = _leftPanel.anchoredPosition.x;
_rightOpenedPosition = _rightPanel.anchoredPosition.x;
}
public void Close(Action callback)
{
Sequence menuCloseSeq = GetCloseSequence();
menuCloseSeq.onComplete += () => callback?.Invoke();
menuCloseSeq.PlayForward();
}
public void Open(Action callback)
{
Sequence menuOpenSeq = GetOpenSequence();
menuOpenSeq.onComplete += () => callback?.Invoke();
menuOpenSeq.PlayForward();
}
public Sequence GetOpenSequence() => GetSequenceByState(true);
public Sequence GetCloseSequence() => GetSequenceByState(false);
private Sequence GetSequenceByState(bool open)
{
float leftTarget = open ? _leftOpenedPosition : 0;
float rightTarget = open ? _rightOpenedPosition : 0;
return GetTransitionSequence(leftTarget, rightTarget);
}
private Sequence GetTransitionSequence(float targetLeftX, float targetRightX)
{
if (_leftPanel == null || _rightPanel == null)
throw new Exception("Панели не назначены!");
var sequence = DOTween.Sequence();
Tween left = _leftPanel.DOAnchorPosX(targetLeftX, _duration)
.SetEase(_ease);
Tween right = _rightPanel.DOAnchorPosX(targetRightX, _duration)
.SetEase(_ease);
sequence.Join(left);
sequence.Join(right);
return sequence;
}
}