DoTween插件介绍及使用示例

发布时间:2024年01月18日

一、什么是 DoTween 插件?

DoTween 是一款 Unity 引擎中的插件,用于处理动画效果。它提供了简单而强大的 API,使得在游戏中创建和管理动画变得更加容易。DoTween 支持许多类型的动画,包括位移、旋转、缩放等,而且可以轻松地集成到 Unity 的编辑器中。

二、安装 DoTween 插件

在 Unity 中安装 DoTween 插件非常简单。你可以从 Unity Asset Store 中直接下载并导入,也可以通过 GitHub 等方式获取最新版本的 DoTween 插件,并将其导入 Unity 项目。

下载地址:DoTween GitHub
官网:DoTween

三、使用方法示例

1.第一种定义和使用方法示例

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class DoTweenTest : MonoBehaviour{
    public Vector3 myValue = new Vector3();
    public Transform CubeTransform;
    public RectTransform RectTransform;
    public float myValue2 = 0;

    // Start is called before the first frame update
    void Start(){
        // 对变量做一个动画(通过插值)
        DOTween.To(() => myValue, x => myValue = x, new Vector3(0, 0, 0), 5);
        // float使用方法
        DOTween.To(() => myValue2, x => myValue2 = x, 10, 5);
    }

    // Update is called once per frame
    void Update(){
        CubeTransform.transform.position = myValue;
        RectTransform.localPosition = myValue;
    }
}

这个示例演示了如何使用DoTween插件对变量进行动画处理,通过插值的方式平滑地将myValue从当前值过渡到新的目标值,同时对myValue2进行浮点数的动画。

2.第二种扩展方法使用方式示例

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class DoTweenTest1 : MonoBehaviour{
    public RectTransform RectTransform;
    public bool isIn = false;

    public void MyClick(){
        // 按照时间坐标系移动
        // RectTransform.DOMove(new Vector3(0, 0, 0), 0.3f);

        // 按照自身坐标系移动
        isIn = !isIn;
        
        if (isIn){
            RectTransform.DOPlayForward();
        }
        else{
            RectTransform.DOPlayBackwards();
        }
    }
}

这个示例展示了使用扩展方法的方式,通过按钮点击事件触发RectTransform的移动动画,根据isIn的状态分别播放正向和反向的动画。

四、动画的属性设置

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class MyCube : MonoBehaviour{
    public GameObject cube;

    // Start is called before the first frame update
    void Start(){
        // 默认位置是从当前位置运行到目标位置,加上From方法表示从目标位置移动到当前位置
        // cube.transform.DOMoveX(5, 1).From();

        Tweener tweener = cube.transform.DOMoveX(0, 5);
        // 设置动画播放曲线
        tweener.SetEase(Ease.InBack);
        // 设置动画播放次数
        tweener.SetLoops(2);
        // 设置事件结束时调用的函数
        tweener.OnStepComplete(test);
    }

    void test(){
        Debug.Log(123);
    }
}

五、常用动画示例

1.Text动画示例

text = GetComponent<Text>();
// 如果为空就一个字的显示,如果不为空则一个字的替换显示
text.DOText("接下来进去第二篇章,点击回车开始游戏", 5);
// 操作文本颜色
text.DOColor(Color.red, 1);
// 操作文本透明度
text.DOFade(1, 3);

这个示例展示了如何使用DoTween插件对Unity中的Text组件进行动画处理。通过DOText方法实现文字内容的变化,DOColor实现颜色的渐变,DOFade实现透明度的淡入效果。

2.自定义属性动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class SequenceExample : MonoBehaviour{
    public Transform target;

    void Start(){
        Sequence sequence = DOTween.Sequence();

        // 添加一系列动画到序列中
        sequence.Append(target.DOMoveX(5, 2));
        sequence.Append(target.DOScale(Vector3.one * 2, 1));
        sequence.Insert(1, target.DORotate(new Vector3(0, 180, 0), 1));
        sequence.AppendCallback(() => Debug.Log("序列!"));
    }
}

这个示例展示了如何通过DoTween插件自定义属性动画。通过获取物体的初始颜色和目标颜色,实现颜色的渐变效果。这种方式可以用于处理一些特定属性的动画效果,使其更加灵活。

3.序列动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class SequenceExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        Sequence sequence = DOTween.Sequence();

        // 添加一系列动画到序列中
        sequence.Append(target.DOMoveX(5, 2));
        sequence.Append(target.DOScale(Vector3.one * 2, 1));
        sequence.Insert(1, target.DORotate(new Vector3(0, 180, 0), 1));
        sequence.AppendCallback(() => Debug.Log("序列动画!"));
    }
}

这个示例展示了如何使用DoTween插件创建序列动画。通过DOTween.Sequence()创建一个序列,然后使用Append和Insert方法添加一系列动画,实现按顺序播放的效果。在动画结束时,通过AppendCallback添加回调函数。

4.动画事件监听

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class EventListenerExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        // 移动到目标位置,然后触发事件
        target.DOMoveX(5, 2).OnComplete(() => Debug.Log("移动完成!"));
    }
}


这个示例演示了如何在动画完成时监听事件。通过OnComplete方法,我们可以在动画结束时执行自定义的回调函数,这样可以更灵活地处理动画完成后的逻辑。

5.路径动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class PathAnimationExample : MonoBehaviour{
    public Transform target;
    public Transform[] pathPoints;

    // Start is called before the first frame update
    void Start(){
        // 沿着路径移动
        target.DOPath(GetPathVector3Array(), 5, PathType.CatmullRom)
            .SetOptions(false)
            .OnComplete(() => Debug.Log("路径动画!"));
    }

    Vector3[] GetPathVector3Array(){
        Vector3[] path = new Vector3[pathPoints.Length];
        for (int i = 0; i < pathPoints.Length; i++){
            path[i] = pathPoints[i].position;
        }
        return path;
    }
}


这个示例演示了如何使用DoTween插件创建路径动画。通过DOPath方法,我们可以沿着一系列路径点移动,使用PathType.CatmullRom表示使用Catmull-Rom样条插值算法来平滑路径。

6.物理动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class PhysicsAnimationExample : MonoBehaviour{
    public Rigidbody rigidbody;

    // Start is called before the first frame update
    void Start(){
        // 模拟物理效果
        rigidbody.DOMoveX(5, 2).SetRelative(true)
            .SetEase(Ease.OutBounce)
            .OnStepComplete(() => Debug.Log("物理动画!"));
    }
}


这个示例展示了如何使用DoTween插件创建物理动画。通过DOMove方法,我们可以模拟物理效果,使物体在指定时间内相对于当前位置移动到新的位置。SetRelative(true)表示相对移动,SetEase设置动画曲线,OnStepComplete添加动画步骤完成的回调函数。

7.混合动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class BlendAnimationExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        // 混合多个动画效果
        Sequence blendSequence = DOTween.Sequence();

        // 旋转
        Tween rotationTween = target.DORotate(new Vector3(0, 180, 0), 2);
        // 移动
        Tween positionTween = target.DOMoveX(5, 2);
        // 缩放
        Tween scaleTween = target.DOScale(Vector3.one * 2, 1);

        // 将动画添加到混合序列中
        blendSequence.Append(rotationTween);
        blendSequence.Append(positionTween);
        blendSequence.Append(scaleTween);
        
        blendSequence.OnComplete(() => Debug.Log("混合动画!"));
    }
}


这个示例展示了如何使用DoTween插件进行混合动画。通过Sequence方法创建一个序列,然后将多个动画效果按顺序添加到序列中,实现多个动画效果的混合。在示例中,我们混合了旋转、移动和缩放三个动画效果。

8.循环动画

sing System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class LoopAnimationExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        // 循环播放动画
        target.DOMoveX(5, 2).SetLoops(-1, LoopType.Yoyo)
            .SetEase(Ease.Linear)
            .OnStepComplete(() => Debug.Log("循环动画!"));
    }
}

这个示例演示了如何使用DoTween插件创建循环动画。通过SetLoops方法设置循环次数,LoopType.Yoyo表示使用倒放的方式循环,即来回播放。在示例中,我们使物体在X轴上移动,来回循环播放。

9.深入使用Tweeners

sing System.Collections;
uusing System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class AdvancedTweenersExample : MonoBehaviour{
    public Transform target;
    void Start(){
        // 使用Tweeners创建更复杂的动画效果
        Sequence sequence = DOTween.Sequence();

        // Tweeners
        Tween rotateTween = target.DORotate(new Vector3(0, 180, 0), 2);
        Tween moveTween = target.DOMoveX(5, 2);
        Tween scaleTween = target.DOScale(Vector3.one * 2, 1);

        // 添加Tweeners到序列中
        sequence.Append(rotateTween);
        sequence.Append(moveTween);
        sequence.Append(scaleTween);

        // 设置Tweeners的顺序关系
        rotateTween.SetRelative(true);
        moveTween.SetRelative(true);
        scaleTween.SetRelative(true);

        // 设置Tweeners的插值方式
        rotateTween.SetEase(Ease.OutBounce);
        moveTween.SetEase(Ease.Linear);
        scaleTween.SetEase(Ease.InOutExpo);

        // 在动画完成时调用回调函数
        sequence.OnComplete(() => Debug.Log("Tweeners动画!"));
    }
}


这个示例深入使用Tweeners,通过Sequence方法创建一个序列,然后使用Tweeners(DORotate、DOMoveX、DOScale)创建更复杂的动画效果。通过设置Tweeners的顺序关系、插值方式以及在动画完成时调用回调函数,使动画效果更加灵活和高级。

10.动画延迟和间隔

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class DelayAndIntervalExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        // 添加动画延迟和间隔
        Sequence sequence = DOTween.Sequence();

        // 在动画开始前延迟1秒
        sequence.AppendInterval(1);

        // 旋转动画
        sequence.Append(target.DORotate(new Vector3(0, 180, 0), 2));
        // 移动动画
        sequence.Append(target.DOMoveX(5, 2));
        // 缩放动画
        sequence.Append(target.DOScale(Vector3.one * 2, 1));

        // 设置动画完成后的回调
        sequence.OnComplete(() => Debug.Log("延迟动画!"));
    }
}

这个示例演示了如何使用DoTween插件添加动画延迟和间隔。通过AppendInterval方法可以在序列中添加动画开始前的延迟时间。在示例中,我们在动画开始前延迟1秒,然后依次播放旋转、移动、缩放的动画效果。

11.动画序列的暂停和恢复

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class PauseResumeExample : MonoBehaviour{
    private Sequence sequence;

    // Start is called before the first frame update
    void Start(){
        // 创建一个动画序列
        sequence = DOTween.Sequence();

        // 添加旋转动画
        sequence.Append(transform.DORotate(new Vector3(0, 180, 0), 2));
        // 添加移动动画
        sequence.Append(transform.DOMoveX(5, 2));
        // 添加缩放动画
        sequence.Append(transform.DOScale(Vector3.one * 2, 1));

        // 设置动画完成后的回调
        sequence.OnComplete(() => Debug.Log("序列动画!"));

        // 启动动画序列
        sequence.Play();
    }

    // Update is called once per frame
    void Update(){
        // 在按下空格键时暂停或恢复动画序列
        if (Input.GetKeyDown(KeyCode.Space)){
            if (sequence.IsPlaying()){
                // 动画正在播放,暂停
                sequence.Pause();
                Debug.Log("暂停动画!");
            }
            else{
                // 动画暂停中,恢复播放
                sequence.Play();
                Debug.Log("播放动画!");
            }
        }
    }
}


这个示例展示了如何在运行时暂停和恢复动画序列。通过使用sequence.Pause()和sequence.Play()方法,我们可以在按下空格键时实现动画序列的暂停和恢复操作。这为游戏中的交互性提供了更多可能性。

12.动画序列的重置和重新播放

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class ResetReplayExample : MonoBehaviour{
    private Sequence sequence;

    // Start is called before the first frame update
    void Start(){
        // 创建一个动画序列
        sequence = DOTween.Sequence();

        // 添加旋转动画
        sequence.Append(transform.DORotate(new Vector3(0, 180, 0), 2));
        // 添加移动动画
        sequence.Append(transform.DOMoveX(5, 2));
        // 添加缩放动画
        sequence.Append(transform.DOScale(Vector3.one * 2, 1));

        // 设置动画完成后的回调
        sequence.OnComplete(() => Debug.Log("序列动画!"));
    }

    // Update is called once per frame
    void Update(){
        // 在按下'R'键时重置和重新播放动画序列
        if (Input.GetKeyDown(KeyCode.R)){
            // 重置动画序列
            sequence.Restart();
            // 启动动画序列
            sequence.Play();
        }
    }
}

这个示例演示了如何在运行时重置和重新播放动画序列。通过使用sequence.Restart()方法,我们可以在按下’R’键时重新启动动画序列,从而实现动画的重播。

13.动画的反向播放

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class ReverseAnimationExample : MonoBehaviour{
    private Tween moveTween;

    // Start is called before the first frame update
    void Start(){
        // 创建一个移动动画
        moveTween = transform.DOMoveX(5, 2);
        // 设置动画完成后的回调
        moveTween.OnComplete(() => Debug.Log("动画完成!"));

        // 启动动画
        moveTween.Play();
    }

    // Update is called once per frame
    void Update(){
        // 在按下'H'键时反向播放动画
        if (Input.GetKeyDown(KeyCode.H)){
            // 反向播放动画
            moveTween.PlayBackwards();
        }
    }
}

这个示例演示了如何在运行时反向播放动画。通过使用PlayBackwards()方法,我们可以在按下’H’键时实现动画的反向播放。这对于在某些情况下需要动态切换动画方向的场景非常有用。

14.动画的自定义回调

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class CustomCallbackExample : MonoBehaviour{
    public Transform target;

    // Start is called before the first frame update
    void Start(){
        // 添加自定义回调
        target.DOMoveX(5, 2)
            .OnStart(() => Debug.Log(" Started!"))
            .OnUpdate(() => Debug.Log(" Updated!"))
            .OnComplete(() => Debug.Log("Completed!"));
    }
}

这个示例展示了如何添加自定义回调函数,以在动画的不同阶段执行特定的操作。通过使用OnStart、OnUpdate、OnComplete等方法,我们可以分别在动画开始、更新和完成时执行自定义的回调函数。

15.动画的取消和销毁

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class CancelDestroyExample : MonoBehaviour{
    private Tween moveTween;

    // Start is called before the first frame update
    void Start(){
        // 创建一个移动动画
        moveTween = transform.DOMoveX(5, 2);
        // 设置动画完成后的回调
        moveTween.OnComplete(() => Debug.Log("Move Animation Completed!"));

        // 启动动画
        moveTween.Play();
    }

    // Update is called once per frame
    void Update(){
        // 在按下'C'键时取消或销毁动画
        if (Input.GetKeyDown(KeyCode.C)){
            if (moveTween.IsPlaying()){
                // 动画正在播放,取消动画
                moveTween.Kill();
            }
            else{
                // 动画暂停中或未播放,销毁动画
                moveTween.Destroy();
  
            }
        }
    }
}

这个示例演示了如何在运行时取消或销毁Tween动画。通过使用Kill()方法可以取消正在播放的Tween动画,而使用Destroy()方法可以销毁Tween动画。

总结

DoTween插件为Unity开发者提供了丰富的动画制作工具,通过简洁而强大的接口,开发者可以轻松实现各种炫酷的动画效果。以上示例展示了DoTween的基本用法,但插件还有更多高级功能等待你去探索,如路径动画、物理动画等。希望本文对你更深入地了解和应用DoTween插件有所帮助。

文章来源:https://blog.csdn.net/qq_34697930/article/details/135655534
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。