Dotween简单安装设置,DoTween简单的API,以及一些回调

本文档介绍了Unity3D插件DoTween的下载、安装和使用步骤。首先,从官方网址下载DoTween并解压缩,然后将其拖拽到Unity项目的Assets目录下,避免放入特定子文件夹。等待Unity加载并配置插件后,安装即完成,可开始使用DoTween进行动画缓动处理。

Unity DOTween动画插件完全指南

一、安装与配置

1.1 下载与安装

  1. 访问DOTween官网下载最新版本
  2. 将下载的压缩包解压后,将整个DOTween文件夹拖入Unity项目的Assets目录
  3. 等待Unity自动导入完成

在这里插入图片描述

注意:不要将DOTween放在Editor、Resources等特殊文件夹内

1.2 初始设置

安装完成后,Unity会自动弹出DOTween设置窗口。如果没有自动弹出,可以通过菜单栏:
Tools > Demigiant > DOTween Utility Panel手动打开。

在这里插入图片描述
在这里插入图片描述

Transform组件的Dotween

Unity 版本Unity2021 1.18f1c1
DoTween版本DOTween_1_2_632
IDEvs2022
系统版本win 10
撰写日期2022年8月

在两个旋转之间来回切换

		//类似汽车的雨刮器
        gameObject.transform.DOLocalRotate(new Vector3(0, 0, 90), 2).SetLoops(-1,LoopType.Yoyo);
		//用两秒钟渐变的旋转到90度,以最短距离
        gameObject.transform.DORotate(new Vector3(90f, 0f, 0f), 2,RotateMode.Fast);

 1. RotateMode.Fast 最快的方式
 2. FastBeyond360 旋转超过360度
 3. WorldAxisAdd 没搞明白
 4. LocalAxisAdd  将给定的旋转添加到转换的局部轴(就像在Unity的编辑器中启用“局部”开关或使用transform. rotate (Space.Self)旋转一个对象)。在这种模式下,最终值总是被认为是相对的 (没搞明白)
		//看向某个目标,只会旋转一次
        gameObject.transform.DOLookAt(cu.transform.position, 2);

在两个点之间坐标进行切换

		//在当前位置与Vector3(4f,4f,4f)之间来回切换,往返的
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f),2).SetLoops(-1,LoopType.Yoyo);
	//在当前位置与Vector3(4f,4f,4f)之间来回切换,耗时2s,每次都从开始点进行
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1,LoopType.Restart);
		//gameobject在两个点   new Vector3(5, 5f, 5f)  之间进行跳跃
        gameObject.transform.DOLocalJump(new Vector3(5, 5f, 5f), 2f, 1, 1).SetLoops(-1,LoopType.Yoyo);
       //DOLocalJump(Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping)
       //endValue 结束点
       //jumpPower 跳跃的力量,Y轴的高度
       //duration 跳跃的总数,分几次跳跃到目标位置
       //snapping 是否平滑,True不平滑,Flase平滑

来回膨胀和变小

就像是心脏的跳动一样
        gameObject.transform.DOScale(new Vector3(3f,3f,3f),2).SetLoops(-1,LoopType.Yoyo);
//旋转到指定的大小
        gameObject.transform.DOScale(new Vector3(3f, 3f, 3f), 2);

Material.Color

    private Color _OrgionColor = Color.black;
    private Color _TargetColor = Color.green;

    private void Start()
    {
       //可用于提示闪烁效果
        gameObject.GetComponent<MeshRenderer>().material.color = _OrgionColor;
        gameObject.GetComponent<MeshRenderer>().material.DOColor(_TargetColor, 2).SetLoops(-1, LoopType.Yoyo).SetId("DotweenAni");
        //获取材质,设置目标颜色,设置切换次数,切换模式,设置ID。
		
            DOTween.Kill("DotweenAni");//在想要停止的地方调用,可以停止动画

    }

可以多个动画同时播放

//很复杂我描述不出来
        gameObject.transform.DOScale(new Vector3(4f, 4f, 4f), 2).SetLoops(-1,LoopType.Yoyo);
        gameObject.GetComponent<MeshRenderer>().material.DOColor(Color.black, 2).SetLoops(-1, LoopType.Yoyo);
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo);
        gameObject.transform.DORotate(new Vector3(180f,180f,180f),2).SetLoops(-1,LoopType.Yoyo);

使用回调

OnComplete_播放结束时调用

yoyo的次数为-1则不会被调用
在运动三次后调用OnComplete

  private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(3, LoopType.Yoyo).OnComplete(MyCallBack);
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Kill("ha");
        }
    }

    private void MyCallBack()
    {
        Debug.Log("哈哈哈");
    }

OnKill_被杀死的时候调用

  private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo).OnComplete(MyCallBack).SetId("ha");
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Kill("ha");//按下A会调用回调
        }
    }

    private void MyCallBack()
    {
        Debug.Log("哈哈哈");
    }

OnPlay_在开始播放的时候调用

在按下暂停然后再播放的时候会调用,第一次自动播放会调用

  private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo).OnPlay(MyCallBack).SetId("ha");
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Pause("ha");
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            DOTween.Play("ha");
        }
    }

    private void MyCallBack()
    {
        Debug.Log("哈哈哈");
    }

OnPause_在暂停的时候调用

播放的时候按下一次调用一次

 private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo).OnPause(MyCallBackPause).SetId("ha");
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Pause("ha");
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            DOTween.Play("ha");
        }
    }

    private void MyCallBack()
    {
        Debug.Log("哈哈哈");
    }

    private void MyCallBackPause()
    {
        Debug.Log("暂停的时候调用我");
    }

OnStepComplete_往返的时候调用

加入循环三次
0-1调用一次
1-2调用一次
2-3调用一次
Loop.Yoyo每次都会调用,0-0不调用

   private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo).OnStepComplete(MyCallBackStepComplete).SetId("ha");
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Pause("ha");
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            DOTween.Play("ha");
        }
    }


    private void MyCallBackStepComplete()
    {
        Debug.Log("哈哈哈");
    }

OnUpdate_在播放的时候就调用

如果暂停或者杀死就不会调用了。

 private void Start()
    {
        gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2).SetLoops(-1, LoopType.Yoyo).OnUpdate(MyCallBackUpdate).SetId("ha");
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            DOTween.Pause("ha");
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            DOTween.Play("ha");
        }
    }


    private void MyCallBackUpdate()
    {
        Debug.Log("哈哈哈");
    }

多个回调同时启用

private void Start()
{
    gameObject.transform.DOMove(new Vector3(4f, 4f, 4f), 2)
        .SetLoops(-1, LoopType.Yoyo)
        .OnStart(MyCallBackStart)
        .OnUpdate(MyCallBackUpdate)
        .OnPlay(MyCallBackPlay)
        .OnKill(MyCallBackKill)
        .SetId("ha");
}


private void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
        DOTween.Pause("ha");
    }
    if (Input.GetKeyDown(KeyCode.D))
    {
        DOTween.Play("ha");
    }
}


private void MyCallBackPlay()
{
    Debug.Log("OnPlay");
}

private void MyCallBackStart()
{
    Debug.Log("开始");

}


private void MyCallBackUpdate()
{
    Debug.Log("哈哈哈");
}

private void MyCallBackKill()
{
    Debug.Log("杀死的时候调用我");

}

DoTwenn.To

using DG.Tweening;
using UnityEngine;

public class DotweenTest : MonoBehaviour
{
    void Start()
    {
        DOTween.To(value =>
        {
            //todo something
        }, 1, 30, 5);
    }

在这里插入图片描述

参数说明:1:开始值
30:结束值
5花费时间
todo something :在这段时间(5s内)需要做的事情。

延迟进行

延迟进行

DOVirtual.DelayedCall

          DOVirtual.DelayedCall(1.0f, () =>
          {
              Debug.Log("延迟一秒执行");
          });

1.0f 是延迟时间,后面跟上方法即可实现延迟一秒执行

DOTween.To

  DOTween.To(() => 0f, x => { }, 1f, 0.2f)
  .OnStart(() => { Debug.Log("开始"); })
  .OnUpdate(() => { Debug.Log("正在进行"); })
  .OnComplete(() => Debug.Log("Hello World"));

开始的时候打印开始
进行的时候打印正在进行
结束后打印helloworld。
时间是0.2f,

就这么多,太多了

请添加图片描述

<think>我们被要求使用中文回答,并且遵循特定的格式要求。用户的问题是关于在Unity中使用DOTween实现延迟回调的示例。 根据引用[2],我们知道DOTween是一个用于Unity的动画插件,可以方便地实现各种动画效果。其中,延迟回调DOTween的一个功能,可以在指定的时间后执行一个回调函数。 在DOTween中,实现延迟回调可以使用`DOVirtual.DelayedCall`方法。这个方法会在指定的延迟时间后调用一个回调函数。 示例代码: ```csharp using UnityEngine; using DG.Tweening; // 引入DOTween命名空间 public class DelayCallbackExample : MonoBehaviour { void Start() { // 延迟2秒后执行回调 DOVirtual.DelayedCall(2f, () => { Debug.Log("2秒延迟后执行的回调"); }); } } ``` 在这个示例中,`DOVirtual.DelayedCall`方法接受两个主要参数: 1. 延迟时间(以秒为单位) 2. 一个回调函数(这里使用了Lambda表达式) 此外,这个方法还有可选的第三个参数,用于设置是否在延迟期间忽略时间缩放(即是否受Time.timeScale影响),默认是false(即受时间缩放影响)。如果希望不受时间缩放影响,可以设置为true。 例如: ```csharp DOVirtual.DelayedCall(2f, () => { /* 回调内容 */ }, true); // 第三个参数设置为true,表示忽略时间缩放 ``` 另外,DOTween还提供了链式调用的方式,可以在一个序列中插入延迟回调。例如: ```csharp Sequence sequence = DOTween.Sequence(); sequence.AppendInterval(1f); // 延迟1秒 sequence.AppendCallback(() => Debug.Log("延迟1秒后执行")); sequence.AppendInterval(1f); sequence.AppendCallback(() => Debug.Log("再延迟1秒后执行")); ``` 但是,如果只需要一个简单的延迟回调,使用`DOVirtual.DelayedCall`是最直接的方式。 注意:使用DOTween前需要导入DOTween插件,并在代码中引入命名空间`using DG.Tweening;`。 根据引用[3],我们知道在Unity中也可以使用协程(Coroutine)来实现延迟回调,但DOTween提供了更简洁的API,特别是在处理动画序列时更为方便。 因此,如果项目中已经使用了DOTween,那么使用`DOVirtual.DelayedCall`是一个不错的选择。 下面是一个更完整的示例,包括在延迟回调中改变物体的位置: ```csharp using UnityEngine; using DG.Tweening; public class Example : MonoBehaviour { public Transform target; void Start() { // 延迟3秒后,将目标物体移动到(0,5,0)的位置 DOVirtual.DelayedCall(3f, () => { target.DOMove(new Vector3(0, 5, 0), 1f); // 移动动画持续1秒 }); } } ``` 在这个例子中,我们等待3秒后,让目标物体在1秒内移动到指定位置。 注意事项: 1. 确保已经正确导入DOTween插件,否则代码无法编译。 2. 如果回调函数中需要执行一些耗时操作,注意避免在每一帧都创建大量回调,以免造成性能问题。 如果用户需要更复杂的时间轴控制,可以参考引用[1]中的时间轴(Timeline)示例,但使用DOTween的延迟回调简单直接。 因此,针对用户的问题,我们提供了使用`DOVirtual.DelayedCall`的示例。 生成相关问题: 根据用户的问题,我们可以生成一些相关问题,以帮助用户更深入地了解DOTween的延迟回调和其他相关功能。 §§相关问题§§ 1. DOTween中的`DOVirtual.DelayedCall`和Unity协程`WaitForSeconds`有什么区别? 2. 如何在DOTween序列中插入延迟回调? 3. DOTween的延迟回调是否受Time.timeScale影响?如何设置? 4. 如何取消DOTween的延迟回调? 5. 除了延迟回调DOTween还有哪些常用的功能?</think>在Unity中使用DOTween实现延迟回调,可以通过`DOVirtual.DelayedCall`方法实现。以下是具体示例和说明: ### 实现步骤 1. **基本延迟回调** 在指定时间后执行回调函数: ```csharp using DG.Tweening; // 引入命名空间 using UnityEngine; public class DelayExample : MonoBehaviour { void Start() { // 延迟2秒后执行回调 DOVirtual.DelayedCall(2f, () => { Debug.Log("2秒延迟后执行的回调"); }); } } ``` 2. **链式调用中的延迟** 在动画序列中插入延迟回调: ```csharp Sequence sequence = DOTween.Sequence(); sequence.Append(transform.DOMoveX(5, 1f)); // 第一步:向右移动 sequence.AppendInterval(0.5f); // 延迟0.5秒 sequence.AppendCallback(() => { Debug.Log("移动完成后的延迟回调"); }); ``` 3. **忽略时间缩放** 若需在游戏暂停(`Time.timeScale=0`)时仍执行回调,添加`true`参数: ```csharp DOVirtual.DelayedCall(3f, () => { Debug.Log("不受Time.timeScale影响的回调"); }, true); // 第三个参数设为true ``` ### 关键说明 - **`DOVirtual.DelayedCall`参数** - 第一个参数:延迟时间(秒) - 第二个参数:回调函数(Lambda表达式或方法名) - 第三个参数(可选):`true`表示忽略`Time.timeScale`[^2] - **与协程对比** 相比Unity协程(需`StartCoroutine`和`yield return new WaitForSeconds`),DOTween延迟回调更简洁,尤其适合与动画序列结合使用[^3]。 ### 完整场景示例 ```csharp using DG.Tweening; using UnityEngine; public class CubeAnimator : MonoBehaviour { public GameObject cube; void Start() { // 延迟1秒后开始动画 DOVirtual.DelayedCall(1f, () => { cube.transform.DOMoveY(3f, 2f) // 上移 .OnComplete(() => Debug.Log("动画完成")); }); } } ``` > **效果**:游戏运行1秒后,物体开始向上移动,动画结束后打印日志。 ### 注意事项 1. 确保项目中已导入DOTween插件(通过Asset Store安装) 2. 脚本需引入命名空间:`using DG.Tweening;` 3. 回调内避免耗时操作,防止卡顿 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值