Unity3D DOTween

简单介绍一下 DOTween 插件的使用。

导入插件

先到 Asset Store 获取 DOTween 插件,然后在 Package Manager 的 My Assets 中搜索,下载并导入插件。

导入插件

导入后,会自动弹出一个窗口,提示需要先对插件进行配置。

打开插件设置界面

点击上图中的按钮,打开下图的窗口,按顺序点击 Setup DOTween 和 Create ASMDEF 按钮。

进行插件配置

配置完成后就可以开始使用 DOTween 插件了。

简单动画

创建一个脚本 DOTweenDemo.cs,在场景中创建一个空物体并挂载脚本。

在场景中创建一个 Cube,拖拽引用。

要使用 DOTween,需要引入命名空间 DG.Tweening,然后通过组件扩展的以 DO 开头的函数方法进行调用。

例如,transform.DOMoveX 是让物体在 X 轴方向上进行移动,第一个参数是目标位置,第二个参数是持续时间。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{public GameObject cube;public float posX = 5f;public float duration = 1f;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){cube.transform.DOMoveX(-posX, duration);}else if (Input.GetKeyDown(KeyCode.Alpha2)){cube.transform.DOMoveX(posX, duration);}}
}

运行游戏,按下键盘 1 键时 Cube 向左移动,按下键盘 2 键时 Cube 向右移动。

简单动画

动画序列

在实际项目中,动画会更加复杂一些,可能会有多段位移,或者位移后缩小的需求。

通常会使用动画序列来实现复杂动画。

使用 DOTween.Sequence 创建一个动画序列对象,通过 sequence.Insert 在指定时刻插入一个简单动画。

例如,在最开始 0 秒的位置,让 Cube 移动到右边。

因为持续时间是 1 秒,所以在 1 秒的位置,上一个动画结束了,继续插入第二个动画,让 Cube 向上移动。

后续的动画以此类推。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{public GameObject cube;public float posX = 5f;public float posY = 5f;public float duration = 1f;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){Sequence sequence = DOTween.Sequence();sequence.Insert(0f, cube.transform.DOMoveX(posX, duration));sequence.Insert(1f, cube.transform.DOMoveY(posY, duration));sequence.Insert(2f, cube.transform.DOMoveX(-posX, duration));sequence.Insert(3f, cube.transform.DOMoveY(0f, duration));}}
}

运行游戏,按下键盘 1 键时 Cube 进行了四段位移。

动画序列

动画回调

有时候,我们想要在动画播放完成之后执行一些逻辑,就可以使用动画的回调方法。

例如,让 Cube 向前移动,到达指定位置之后,再缩小。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{public GameObject cube;public float posX = 5f;public float posY = 5f;public float duration = 1f;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){cube.transform.DOMoveZ(5f, duration).OnComplete(()=>{cube.transform.DOScale(0f, duration);});}}
}

运行效果:

动画回调

结束动画

有时候,玩家进行了某些操作,需要提前让动画结束,有两种方法。

一种是直接 Kill 掉动画,即中断动画。

一种是提前完成动画。

在 Kill 掉动画的时候,需要先为动画设置 id,然后使用 DOTween.Kill 中断指定 id 的动画。

注意:这里只为 DOMoveZ 设置了 id,当它结束时播放的另一个缩放动画是不会被 Kill 掉的。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{public GameObject cube;public float posX = 5f;public float posY = 5f;public float duration = 1f;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){cube.transform.DOMoveZ(5f, duration).OnComplete(()=>{cube.transform.DOScale(0f, duration);}).SetId("cube");}else if (Input.GetKeyDown(KeyCode.Alpha2)){DOTween.Kill("cube");}}
}

运行效果,先按键盘 1 键执行动画,再立刻按键盘 2 键中断动画。

杀掉动画

提前完成动画,只需要调用 DOComplete 函数即可。

这里因为是 transform 调用的,对于两段动画来说,都是可以提前完成的。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{public GameObject cube;public float posX = 5f;public float posY = 5f;public float duration = 1f;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){cube.transform.DOMoveZ(5f, duration).OnComplete(()=>{cube.transform.DOScale(0f, duration);});}else if (Input.GetKeyDown(KeyCode.Alpha2)){cube.transform.DOComplete();}}
}

运行效果,先按键盘 1 键执行动画,再立刻按键盘 2 键提前完成动画,会有一个动画跳跃的视觉效果。

提前完成动画

延迟调用

DOTween 除了做一些动画效果外,还可以当做定时器,延迟一段时间后调用。

using UnityEngine;
using DG.Tweening;public class DOTweenDemo : MonoBehaviour
{void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){Debug.Log("开始定时");DOVirtual.DelayedCall(1f, ()=>{Debug.Log("1 秒后调用");});}}
}

运行效果:

延迟调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/324050.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数,用于处理Unix/Linux系…

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境: 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板,(一时脑热买了两块 RK3568 开发板),Atompi-CA1 RK3568 开发板比较小巧,利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

Android 11 输入系统之InputDispatcher和应用窗口建立联系

InputDispatcher把输入事件传给应用之前,需要和应用窗口建立联系,了解了这个过程,就清楚了APP进程和InputDispatcher线程也就是SystemServer进程之间是如何传输数据了 我们向窗口addView的时候,都会调用到ViewRootImpl的setView方…

热爱电子值得做的电子制作实验

加我zkhengyang,进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作,磁带随声听散件,黑白电视机散件制作,功放散件制作,闪光灯散件制作,声控灯散件,等等,可提高动手能…

kali linux更新卡在libc6:amd64 (2.37-15)

适配于linux的windows子系统,wsl2,安装kali linux,运行 sudo apt update 卡在:Setting up libc6:amd64 (2.37-15) … 关机重启、重新修复执行也不行 解决办法:kill当前apt进程或者关机重启kali-linux,然…

【Linux】学习笔记

文章目录 [toc]第一章:基础篇01|课程介绍02|内容综述03|什么是Linux04|Linux的内核版本及常见发行版内核版本发行版本Red Hat Enterprise LinuxFedoraCentOSDebianUbuntu 05|安装VirtualBox虚拟机VirtualBox下载url 06|在虚拟机中安装Linux系统Linux安装镜像下载 07…

SpringBoot+vue实现右侧登录昵称展示

目录 1. 定义User数据 1.1.在created方法获取数据 1.2.头部导航栏绑定User数据 1.3.在data中定义User数据 2. 获取数据 2.1.接收父组件传递的值 2.2.展示数据 3. 页面效果 在SpringBoot和 Vue.js 结合的项目中实现右侧登录昵称展示,通常涉及到前端的用户界面…

ROS机器人入门:机器人系统仿真【学习记录】——2

承接上一篇博客: ROS机器人入门:机器人系统仿真【学习记录】——1-CSDN博客 我们先前结束了(上一篇博客中): 1. 概述 2. URDF集成Rviz基本流程 3. URDF语法详解 4. URDF优化_xacro 下面让我们继续学习ROS机器人…

会话劫持攻击就在我们身边,我们要如何防范

会话劫持攻击(Session Hijacking)是一种网络攻击方式,攻击者通过某种手段获取到用户的会话标识(Session ID),然后使用这个会话标识冒充合法用户进行恶意操作。这种攻击方式允许攻击者以合法用户的身份访问受…

FFmpeg常用命令详解与实战指南

下载地址:Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件,然后使用FFmpeg内置的分析器来获取视频的各种信息,包括视频编解码器、音频编解码器、分辨…

《Mask2Former》算法详解

文章地址:《Masked-attention Mask Transformer for Universal Image Segmentation》 代码地址:https://github.com/facebookresearch/Mask2Former 文章为发表在CVPR2022的一篇文章。从名字可以看出文章像提出一个可以统一处理各种分割任务(…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高,公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式,通过运用数据技术和大数据分析手段,彻底改变了公厕管理的模式&#xf…

远程桌面连接不上怎么连服务器,原因是什么?如何解决?

远程桌面连接不上怎么连服务器,原因是什么?如何解决? 面对远程桌面连接不上的困境,我们有办法! 当你尝试通过远程桌面连接服务器,但遭遇连接失败的挫折时,不要慌张。这种情况可能由多种原因引起…

26、Qt使用QFontDatabase类加载ttf文件更改图标颜色

一、图标下载 iconfont-阿里巴巴矢量图标库 点击上面的链接,在打开的网页中搜索自己要使用的图标,如:最大化 找到一个自己想用图标,选择“添加入库” 点击“购物车”图标 能看到刚才添加的图标,点击“下载代码”(需要…

4D 成像毫米波雷达:新型传感器助力自动驾驶

1 感知是自动驾驶的首要环节,高性能传感器必不可少 感知环节负责对侦测、识别、跟踪目标,是自动驾驶实现的第一步。自动驾驶的实现,首先要能够准确理解驾驶环境信息,需要对交通主体、交通信号、环境物体等信息进行有效捕捉&#x…

数据可视化训练第二天(对比Python与numpy中的ndarray的效率并且可视化表示)

绪论 千里之行始于足下;继续坚持 1.对比Python和numpy的性能 使用魔法指令%timeit进行对比 需求: 实现两个数组的加法数组 A 是 0 到 N-1 数字的平方数组 B 是 0 到 N-1 数字的立方 import numpy as np def numpy_sum(text_num):"""…

一起深度学习(AlexNet网络)

AlexNet神经网络 代码实现: 代码实现: import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(# 采用了11*11的卷积核来捕捉对象,因为原始输入数据比较大#步幅为4 ,可减少输出的高度核宽度。#输出通…

全栈开发之路——前端篇(6)生命周期和自定义hooks

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

基于springboot实现疾病防控综合系统项目【项目源码+论文说明】

基于springboot实现疾病防控综合系统演示 摘要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…