Unity【DoTween】- 如何使Transform Tween动画序列可编辑

2022-08-29 16:53:38 浏览数 (1)

使用DoTween的动画序列功能时,我们需要编写类似这样的代码:

代码语言:javascript复制
DOTween.Sequence()
    .Append(transform.DOMove(new Vector3(1f, 2f, 3f), 1f))
    .Append(transform.DORotate(new Vector3(0f, 0f, 0f), 1f));

本文介绍的内容可以将DoTween的这种动画序列在编辑器中进行编辑,如图所示:

实现代码:

代码语言:javascript复制
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;
            }
        }
    }
}
代码语言:javascript复制
namespace SK.Framework
{
    public enum TransformTweenAnimationType 
    {
        Move,

        Rotate,

        Scale
    }
}
代码语言:javascript复制
namespace SK.Framework
{
    public enum SpaceType 
    {
        Local,

        Global
    }
}
代码语言:javascript复制
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();
                }
            }
        }
    }
}
代码语言:javascript复制
使用示例:
代码语言:javascript复制
using UnityEngine;
using SK.Framework;

public class TEST : MonoBehaviour
{
    [SerializeField] private TransformTweenAnimations animations;

    private void Start()
    {
        animations.Play();
    }
}

0 人点赞