62 lines
1.9 KiB
C#
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] private 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 = GetCloseSequence();
|
|
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;
|
|
}
|
|
} |