使用DoTween的动画序列功能时,我们需要编写类似这样的代码:
DOTween.Sequence() .Append(transform.DOMove(new Vector3(1f, 2f, 3f), 1f)) .Append(transform.DORotate(new Vector3(0f, 0f, 0f), 1f));
本文介绍的内容可以将DoTween的这种动画序列在编辑器中进行编辑,如图所示:
实现代码:
using System; using DG.Tweening; using UnityEngine; namespace SK.Framework { [Serializable] public sealed class TransformTweenAnimation { public Transform actor; public TransformTweenAnimationType type; public SpaceType space; public bool isCustom; public Vector3 startValue; public Vector3 endValue; public float duration = 1f; public float delay; public Ease ease; public RotateMode rotateMode; public Tween Play() { switch (type) { case TransformTweenAnimationType.Move: switch (space) { case SpaceType.Local: if (isCustom) actor.localPosition = startValue; return actor.DOLocalMove(endValue, duration).SetDelay(delay).SetEase(ease); case SpaceType.Global: if (isCustom) actor.position = startValue; return actor.DOMove(endValue, duration).SetDelay(delay).SetEase(ease); default: return null; } case TransformTweenAnimationType.Rotate: switch (space) { case SpaceType.Local: if (isCustom) actor.localRotation = Quaternion.Euler(startValue); return actor.DOLocalRotate(endValue, duration, rotateMode).SetDelay(delay).SetEase(ease); case SpaceType.Global: if (isCustom) actor.rotation = Quaternion.Euler(startValue); return actor.DORotate(endValue, duration, rotateMode).SetDelay(delay).SetEase(ease); default: return null; } case TransformTweenAnimationType.Scale: if (isCustom) actor.localScale = startValue; return actor.DOScale(endValue, duration).SetDelay(delay).SetEase(ease); default: return null; } } } }
namespace SK.Framework { public enum TransformTweenAnimationType { Move, Rotate, Scale } }
namespace SK.Framework { public enum SpaceType { Local, Global } }
using System; using DG.Tweening; namespace SK.Framework { [Serializable] public sealed class TransformTweenAnimations { public bool isSequence; public TransformTweenAnimation[] tweens = new TransformTweenAnimation[0]; public void Play() { if (isSequence) { Sequence sequence = DOTween.Sequence(); for (int i = 0; i < tweens.Length; i++) { sequence.Append(tweens[i].Play()); } sequence.Play(); } else { for (int i = 0; i < tweens.Length; i++) { tweens[i].Play(); } } } } }
使用示例:
using UnityEngine; using SK.Framework; public class TEST : MonoBehaviour { [SerializeField] private TransformTweenAnimations animations; private void Start() { animations.Play(); } }