79 lines
2.4 KiB
C#
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;
|
|
}
|
|
}
|