79 lines
2.4 KiB
C#

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.PlaySfx(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;
}
}