using DG.Tweening; using UnityEngine; using UnityEngine.UI; public class MToggle : MonoBehaviour { [Header("Общее")] [SerializeField] private Ease ease = Ease.OutCubic; [SerializeField] private float _duration = 0.2f; [Header("Задний фон")] [SerializeField] private Image _background; [SerializeField] private Color _enabledBgColor; [SerializeField] private Color _disabledBgColor; [Header("Handle")] [SerializeField] private Image _handleImage; [SerializeField] private Color _enabledHandleColor; [SerializeField] private Color _disabledHandleColor; [Header("Позиционирование")] [SerializeField] private RectTransform _handlerect; [SerializeField] private float _xOffset; [Header("Звуки")] [SerializeField] private AudioClip EnableSound; [SerializeField] private AudioClip DisableSound; private Sequence _animation; public bool Value { get; private set; } public void SetValue(bool value) { Value = value; SoundManager.instance.playClip(value ? EnableSound : DisableSound); StopAnimation(); _animation = GetAnimation(value); _animation.onComplete += () => StopAnimation(); _animation.PlayForward(); } public void DisplayImmediate(bool enable) { Value = enable; var bgColor = enable ? _enabledBgColor : _disabledBgColor; var handleColor = enable ? _enabledHandleColor : _disabledHandleColor; var handleX = enable ? _xOffset : -_xOffset; _background.color = bgColor; _handleImage.color = handleColor; _handlerect.anchoredPosition = new Vector2(handleX, 0); } private Sequence GetAnimation(bool enable) { var bgColor = enable ? _enabledBgColor : _disabledBgColor; var handleColor = enable ? _enabledHandleColor : _disabledHandleColor; var handleX = enable ? _xOffset : -_xOffset; Sequence seq = DOTween.Sequence(); seq.Join(_background.DOColor(bgColor, _duration).SetEase(ease)); seq.Join(_handleImage.DOColor(handleColor, _duration).SetEase(ease)); seq.Join(_handlerect.DOAnchorPosX(handleX, _duration).SetEase(ease)); return seq; } private void StopAnimation() { if (_animation == null) return; _animation.Kill(); _animation = null; } }