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