Unity一些DOTween动画封装
【代码】Unity实现按钮点击按下动画+UI。
·
按钮:
public class BtnScaleTool : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
[FormerlySerializedAs("_downScale")] [SerializeField, Header("按下时缩小至多少?"), Range(0, 1)]
private float downScale = 0.95f;
[FormerlySerializedAs("_downDuration")] [SerializeField, Header("缩放变化持续时间:按下过程")]
private float downDuration = 0.1f;
[FormerlySerializedAs("_upDuration")] [SerializeField, Header("缩放变化持续时间:抬起过程")]
private float upDuration = 0.1f;
private RectTransform RectTransform
{
get
{
if (_rectTransform == null)
{
_rectTransform = GetComponent<RectTransform>();
}
return _rectTransform;
}
}
private RectTransform _rectTransform;
public void OnPointerDown(PointerEventData eventData)
{
StopAllCoroutines();
StartCoroutine(ChangeScaleCoroutine(1, downScale, downDuration));
}
public void OnPointerUp(PointerEventData eventData)
{
StopAllCoroutines();
StartCoroutine(ChangeScaleCoroutine(RectTransform.localScale.x, 1, upDuration));
}
private IEnumerator ChangeScaleCoroutine(float beginScale, float endScale, float duration)
{
float timer = 0f;
while (timer < duration)
{
RectTransform.localScale = Vector3.one * Mathf.Lerp(beginScale, endScale, timer / duration);
timer += Time.fixedDeltaTime;
yield return null;
}
RectTransform.localScale = Vector3.one * endScale;
}
private void OnDisable()
{
RectTransform.localScale = Vector3.one;
}
}
UI放大缩小动画(基于DoTween)
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using UnityEngine;
public class TelescopicTool : MonoBehaviour
{
[SerializeField,Range(1f, 2f),Header("放大倍数")] private float magnification = 1.2f;
[SerializeField,Range(0f, 5f),Header("伸缩持续时间")] private float magnificationSpeed = 0.6f;
private Vector3 _minScale;
private Vector3 _maxScale;
private bool _flag;
private TweenerCore<Vector3, Vector3, VectorOptions> _tween;
private void OnEnable()
{
_flag = true;
_minScale = transform.localScale;
_maxScale = _minScale * magnification;
StartCartoon();
}
/// <summary>
/// 缩放动画
/// </summary>
private void StartCartoon()
{
if (!_flag)
{
return;
}
_tween = transform.DOScale(_maxScale,magnificationSpeed)
.SetEase(Ease.Linear)
.OnComplete(() =>
{
transform.DOScale(_minScale, magnificationSpeed)
.SetEase(Ease.Linear)
.OnComplete(StartCartoon);
});
}
private void OnDisable()
{
_tween?.Kill();
_flag = false;
transform.localScale = _minScale;
}
}
旋转:
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
using UnityEngine;
public class RotationLooper : MonoBehaviour
{
private TweenerCore<Quaternion, Vector3, QuaternionOptions> _loops;
private readonly Vector3 _clockwiseEndValue = new Vector3(0, 0, -360);
private readonly Vector3 _counterClockwiseEndValue = new Vector3(0, 0, 360);
[Header("顺时针")][SerializeField] private bool isClockwise = true;
[Header("匀速")][SerializeField] private bool isUniformSpeed = true;
[SerializeField] private float rotationDuration = 1f;
private void OnEnable()
{
Vector3 endValue = isClockwise ? _clockwiseEndValue : _counterClockwiseEndValue;
_loops = transform.DORotate(endValue, rotationDuration, RotateMode.FastBeyond360)
.SetLoops(-1)
.SetEase(isUniformSpeed ? Ease.Linear : Ease.OutQuad);
}
private void OnDisable()
{
_loops.Kill();
transform.localRotation = Quaternion.identity;
}
}
呼吸:
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;
public class FadeBreathingEffect : MonoBehaviour
{
[Header("最小透明度")][SerializeField] [Range(0f, 1f)]private float _minAlpha = 0.3f; // 最小透明度
[Header("渐隐渐现周期")][SerializeField] private float _duration = 1.5f; // 渐隐渐现周期
private Image _image;
private CanvasGroup _canvasGroup;
private SpriteRenderer _spriteRenderer;
private Renderer _renderer;
private Tweener _tweener;
private void OnEnable()
{
_image = GetComponent<Image>();
_canvasGroup = GetComponent<CanvasGroup>();
_spriteRenderer = GetComponent<SpriteRenderer>();
_renderer = GetComponent<Renderer>();
ApplyFadeEffect();
}
private void ApplyFadeEffect()
{
if (_canvasGroup != null)
{
_tweener = DOTween.To(() => _canvasGroup.alpha, x => _canvasGroup.alpha = x, _minAlpha, _duration)
.SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutSine);
}else if (_image != null)
{
_tweener = DOTween.To(() => _image.color.a, x =>
{
var color = _image.color;
color.a = x;
_image.color = color;
}, _minAlpha, _duration)
.SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutSine);
}
else if (_spriteRenderer != null)
{
_tweener = DOTween.To(() => _spriteRenderer.color.a, x =>
{
Color color = _spriteRenderer.color;
color.a = x;
_spriteRenderer.color = color;
}, _minAlpha, _duration)
.SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutSine);
}
else if (_renderer != null)
{
Material material = _renderer.material;
_tweener = DOTween.To(() => material.color.a, x =>
{
Color color = material.color;
color.a = x;
material.color = color;
}, _minAlpha, _duration)
.SetLoops(-1, LoopType.Yoyo)
.SetEase(Ease.InOutSine);
}
}
private void OnDisable()
{
_tweener.Kill();
ResetAlpha();
}
private void ResetAlpha()
{
if (_canvasGroup != null)
{
_canvasGroup.alpha = 1f;
}
else if (_spriteRenderer != null)
{
Color color = _spriteRenderer.color;
color.a = 1f;
_spriteRenderer.color = color;
}
else if (_renderer != null)
{
Material material = _renderer.material;
Color color = material.color;
color.a = 1f;
material.color = color;
}
}
}
更多推荐
所有评论(0)