Unity3d C#使用DOTween插件的Sequence实现系列动画OnComplete无效和颜色设置无效的问题记录
前言
最近在弄一个文字动画效果的动画,使用了DOTween插件的Sequence来实现,主要就是对一个Text进行的文字打字、缩放和颜色设置等动画,功能是先对Text实现打字的动画,打字完成后,延时几秒对文字进行缩小、颜色变淡(逐渐透明的效果)的过程,在这个过程完成后,重置缩放比例和颜色(透明度),继续重复上一步的动作,直到所有结束。想象中的效果如下:
然而,理想很丰满,现实很骨干,当我按这个思路编码后并不能实现上面的效果,而是这样的效果:
不错没有卡,只进行了第一步的动画…
而我的编码完全是根据如上的思路编写:
TipText.transform.localScale = Vector3.one;TipText.color = new Color32(255, 255, 255, 255);Sequence seq1 = DOTween.Sequence();seq1.Append(TipText.DOText("这是!!!", 1f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f)).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;TipText.text = "";});seq1.Append(TipText.DOText("DOTween插件的.....", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f)).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one * 2;TipText.text = "";});seq1.Append(TipText.DOText("超级大Bug!!!", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f)).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;TipText.text = "";}); seq1.Append(TipText.DOText("Sequence OnComplete无效&Text.color设置无效。", 4f));seq1.Play();
修改过程
如上的问题很直接的能看出是只进行了第一步的动画,而在Inspector上还是能明显的看出来,后续动画也进行了:
只不过text的状态没有重置,也就是没有进入OnComplete函数,造成了缩放,特别是透明度一直是0,所以就不可见,这点我在OnComplete函数中打了log验证了。还有一点是最后一个Append函数的log输出了,也就是执行了。
然后我将OnComplete函数从Join放到了Append上:
seq1.Append(TipText.DOText("这是!!!", 1f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f)).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;TipText.text = "";});
转换后:
seq1.Append(TipText.DOText("这是!!!", 1f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f)).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;Debug.Log(TipText.text);TipText.text = "";});seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f));
效果还是一样的,也没有进入OnComplete函数,经过很长时间的琢磨、查文档和检查代码,终于发现OnComplete函数的放在了外层,应该放到DOScale函数的一层,而我误将其放到了Append函数层了。
正确的应该这样修改:
seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f).OnComplete(() => {}));
进行了如上修改后,OnComplete函数里的日志都输出了:
不过效果还是同最开始的动画,查看后发现虽然执行了OnComplete函数但是颜色修改的语句没实现或者被什么还原了:
我感觉可能被seq1.Join(TipText.DOColor())函数影响了,我尝试将DOColor的缩小duration(2–> 1.8)一点试试:
TipText.transform.localScale = Vector3.one;TipText.color = new Color32(255, 255, 255, 255);Sequence seq1 = DOTween.Sequence();seq1.Append(TipText.DOText("这是!!!", 1f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;Debug.Log(TipText.text);TipText.text = "";}));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 1.8f));seq1.Append(TipText.DOText("DOTween插件的.....", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one * 2;Debug.Log(TipText.text);TipText.text = "";}));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 1.8f));seq1.Append(TipText.DOText("超级大Bug!!!", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;Debug.Log(TipText.text);TipText.text = "";}));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 1.8f)); seq1.Append(TipText.DOText("Sequence OnComplete无效&Text.color设置无效。", 4f).OnComplete(() => {Debug.Log("执行完成");}));seq1.Play();
终于正常了:
这样就说明了DOColor还原了OnComplete设置的颜色值。
如果真是这样的话,我刚开始OnComplete不执行的问题是因为写错OnComplete函数的层级的问题,再引起了无法设置颜色的问题,如果我一开始就在DOColor上正确的OnComplete就没有这些问题了?验证这个问题,我又还原了最开始的代码并修正了OnComplete层级错误的问题:
TipText.transform.localScale = Vector3.one;TipText.color = new Color32(255, 255, 255, 255);Sequence seq1 = DOTween.Sequence();seq1.Append(TipText.DOText("这是!!!", 1f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;Debug.Log(TipText.text);TipText.text = "";}));seq1.Append(TipText.DOText("DOTween插件的.....", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one * 2;Debug.Log(TipText.text);TipText.text = "";}));seq1.Append(TipText.DOText("超级大Bug!!!", 2f));seq1.AppendInterval(1);seq1.Append(TipText.transform.DOScale(new Vector3(0.1f, 0.1f, 0.1f), 2f));seq1.Join(TipText.DOColor(new Color32(255, 255, 255, 0), 2f).OnComplete(() => {TipText.color = new Color32(255, 255, 255, 255);TipText.transform.localScale = Vector3.one;Debug.Log(TipText.text);TipText.text = "";})); seq1.Append(TipText.DOText("Sequence OnComplete无效&Text.color设置无效。", 4f).OnComplete(() => {Debug.Log("执行完成");}));seq1.Play();
也得到了正确的效果!!!
问题总结
OnComplete不执行
这里的OnComplete不执行的问题就是因为层级的问题,这个我是很少犯这种错误的,但是这次也是搞的自己一头雾水。
颜色设置无效
这个应该是系列问题,如果颜色、缩放、位置等属性,在其它并行动画结束事件中修改这些属性的话,可能会有这类的异常,如上我的测试可以看出,如果DOFade/DOColor的执行时间少于,结束事件动画的执行时间,还是可以的,这样的话,如果动画过程并行复杂的情况,处理起来会很复杂的。所以建议还是动画过程关联的属性自己在结束事件中修改这些属性。例如:
颜色/透明度(DOFade/DOColor)
DOFade/DOColor(属性, 时间)..OnComplete(() => {
//这里修改颜色/透明度
});
缩放(DOScale/DOScaleX/DOScaleY/DOScaleZ)
DOScale/DOScaleX/DOScaleY/DOScaleZ(属性, 时间)..OnComplete(() => {
//这里修改位置
});
缩放(DOScale/DOScaleX/DOScaleY/DOScaleZ)
DOScale/DOScaleX/DOScaleY/DOScaleZ(属性, 时间)..OnComplete(() => {
//这里修改大小
});
移动(DOMove/DOMoveX/DOMoveY/DOMoveZ…)
DOMove/DOMoveX/DOMoveY/DOMoveZ...(属性, 时间)..OnComplete(() => {
//这里修改位置
});
…
以此类比修改。
本文内容基于DOTweenPro v1.0.244测试再现问题,仅供参考。
相关文章:
Unity3d C#使用DOTween插件的Sequence实现系列动画OnComplete无效和颜色设置无效的问题记录
前言 最近在弄一个文字动画效果的动画,使用了DOTween插件的Sequence来实现,主要就是对一个Text进行的文字打字、缩放和颜色设置等动画,功能是先对Text实现打字的动画,打字完成后,延时几秒对文字进行缩小、颜色变淡&am…...
【蓝桥杯-筑基篇】排序算法
🍓系列专栏:蓝桥杯 🍉个人主页:个人主页 目录 前言: 一、冒泡排序 二、选择排序 三、插入排序 四、图书推荐 前言: 算法工具推荐: 还在为数据结构发愁吗?这款可视化工具,帮助你更好的了解…...
编辑器进化 VSCode + Vim
本文作者为 360 奇舞团前端工程师VSCode 是一款非常流行的代码编辑器。它支持多种编程语言,拥有丰富的插件和调试功能,不论是处理前端工程还是后端工程,VSCode 都能提供给开发者优秀的用户体验。鉴于 VSCode 超高的流行度,我会默认…...
LearnOpenGL-高级OpenGL-6.天空盒
本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject 文章目录天空盒介绍如何采样OpenGL纹理目标例子0:天空盒效果环境映射反射例子1:Cube…...
Printk打印内核日志
一、背景 Linux 内核中提供了内核日志打印的工具printk。它的使用方式C语言中的printf是类似的。接下来我们介绍一下printk的使用方式。本文以打印Binder中的日志为例,进行演示。 printk的方法声明和日志级别binder驱动中增加 打印代码android系统中查看日志信息 …...
界面控件DevExpress WPF 202计划发布的新功能合集
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。本文将介绍今年DevExpr…...
Spring Cloud Alibaba 微服务2,注册中心演变 + Nacos注册中心与配置中心
目录专栏导读一、什么是Nacos?二、注册中心演变及其设计思想1、RestTemplate调用远程服务2、通过Nginx维护服务列表(upStream)3、通过Nacos实现注册中心4、心跳版Nacos三、Nacos Discovery四、Nacos核心功能1、服务注册2、服务心跳3、服务同步…...
Navicat 图形化界面工具
Navicat 介绍 Navicat是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、SQL Server等不同类型的数据库 目录 Navicat 介绍 Navicat 下载 Navicat 安装 Navicat 使用 Navicat连接MySQL数据库 Navicat创建数据库和表 Navicat 下载 1、点击这…...
2023年网络安全比赛--attack(新)数据包分析中职组(超详细)
一、竞赛时间 180分钟 共计3小时 任务环境说明: 1 分析attack.pcapng数据包文件,通过分析数据包attack.pcapng找出恶意用户第一次访问HTTP服务的数据包是第几号,将该号数作为Flag值提交; 2.继续查看数据包文件attack.pcapng,分析出恶意用户扫描了哪些端口,将全部的端口号…...
C语言之extern(七十)
extern同一个文件:修饰变量声明#include <stdio.h>int add(){extern int x,y;return x y; }int main(){printf("%d\n", add()); }int x 10; int y 20;extern文件之间:修饰函数声明<1>.add.cint sum(){extern int x ;extern in…...
树的前中后序的Morris遍历
目录 一.Morris遍历 1.什么是Morris遍历 2.基本思想 3.Morris遍历的优点和缺点 4.知识回顾----二叉树的线索化 二.中序Morris遍历 1.中序Morris遍历的分析 2.中序Morris遍历的思路 3.具体的代码实现 三.前序Morris遍历 1.前序Morris遍历的思路 2.具体的代码实现 四…...
到底什么是线程?线程与进程有哪些区别?
上一篇文章我们讲述了什么是进程,进程的基本调度 http://t.csdn.cn/ybiwThttp://t.csdn.cn/ybiwT 那么本篇文章我们将了解一下什么是线程?线程与进程有哪些区别?线程应该怎么去编程? 目录 http://t.csdn.cn/ybiwThttp://t.csdn…...
你真的知道如何系统高效地学习数据结构与算法吗?
文章目录前言:什么是数据结构?什么是算法?学习这个算法需要什么基础?学习的重点在什么地方?一些可以让你事半功倍的学习技巧1.边学边练,适度刷题2.多问、多思考、多互动3.打怪升级学习法4.知识需要沉淀&…...
Linux操作系统基础的常用命令
1,Linux简介Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。1.1Linux介绍Linux出现于1991年,…...
Jasypt加密库基本使用方法
目录 1 Jasypt简介... 2 基础知识回顾... 3 Jasypt基本加密器... 4 JasyptPBE加密器... 5 Jasypt池化加密器... 6 Jasypt客户端工具... 7 JasyptSpringboot基本用法... 8 JasyptSpringboot自定义加密器... 9 JasyptSprin…...
C++并发编程之五 高级线程管理
文章目录5.1.1 线程池5.1.1 线程池 在前面我们引入了线程的通信和同步手段,那么为什么还要引入线程池呢? 线程池是一种管理多个线程的技术,它可以减少线程的创建和销毁的开销,提高并发性能。线程池中有一定数量的空闲线程&#x…...
单片机——IIC协议与24C02
1、基础知识 1.1、IIC串行总线的组成及工作原理 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 1.2、I2C总线的数据传输 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟…...
案例05-将不必要的逻辑放到前端(发送调查问卷)
目录一:背景介绍背景二:思路&方案重大问题:解决办法优点:三:总结一:背景介绍 本篇博客书写的意义是警示大家不必把不必要的逻辑放到前端。 明确前后端分离的意义。 背景 下面的主要逻辑是࿱…...
【每日一题】——矩阵相等判定
🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟢 读书笔记 🟡 C语言跬步积累 🌈座右铭:广积粮,缓称…...
Linux防火墙的关闭
查看防火墙的状态打开终端输入如下命令systemctl status firewalld如图所示:running表示防火墙目前处于打开状态输入命令进行关闭防火墙:systemctl stop firewalld如图所示正常的用户是没有权限的,需要输入管理员的密码才能够进行关闭防火墙。…...
Request和Response的概述
⭐作者介绍:大二本科网络工程专业在读,持续学习Java,输出优质文章⭐作者主页:︶ㄣ释然⭐如果觉得文章写的不错,欢迎点个关注😉有写的不好的地方也欢迎指正,一同进步😁Request和Respo…...
常见的Web安全漏洞:SYN攻击/CSRF/XSS
一、SYN攻击(属于DOS攻击) 什么情况下被动方出现SYN_RCVD状态?(flood攻击服务) 客户伪造 ip 端口, 向服务端发送SYN请求。完成2次握手,第三次服务端 等待客户端ACK确认,但由于客户不存在服务端一直未收到确认&#…...
【STC15单片机】 超声波模块的使用
目录 1 基于STC15F2K60S2的超声波测距代码 1.1 基本注意事项 1.1.1 跳线帽接法 1.1.2 晶振设置 1.2 板载超声波工作原理 1.2.1 原理总结 1.2.2 超声波代码思路 1.3 STC15单片机代码部分 1.3.1 定时器0&定时器1初始化 1.3.2 超声波ultrasonic.c ultrasonic.h文件配…...
SpringBoot 动态操作定时任务(启动、停止、修改执行周期)增强版
前段时间编写了一篇博客SpringBoot 动态操作定时任务(启动、停止、修改执行周期,该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方: 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务&am…...
快排函数 -- qsort函数(Quick Sort)
文章目录🔎1.qsort函数简介💡1.1.函数原型💡1.2.参数含义🔎2.比较函数介绍🔎3.比较函数使用案例💡3.1.整型数组💡3.2.浮点型数组💡3.3.结构体类型 - 字符串🔎4.利用冒泡排…...
条形码和二维码
前言:需要的包的相关文档 1. Barcode:https://pypi.org/project/python-barcode/0.8.1/ 2. Qrcode:https://pypi.org/project/qrcode/ 3. Zbar: https://pypi.org/project/pyzbar/ 4. Opencv: https://docs.opencv.org/3.4.11/ 5. OpenC…...
大数据-学习实践-5企业级解决方案
大数据-学习实践-5企业级解决方案 (大数据系列) 文章目录大数据-学习实践-5企业级解决方案1知识点2具体内容2.1小文件问题2.1.1 SequenceFile2.1.2 MapFile2.1.3 小文件存储计算2.2数据倾斜2.3 YARN2.3.1 YARN架构2.3.2 YARN调度器2.3.2 YARN多资源队列配置和使用2.4Hadoop官方…...
破解吲哚花菁素IR-808 N3,IR-808 azide,IR-808叠氮,酯溶性染料修饰叠氮基团,相关知识
基础产品数据(Basic Product Data):CAS号:N/A中文名:IR-808叠氮英文名:IR-808 N3,IR-808 azideIR-808结构式(Structural):详细产品数据(Detailed …...
面试官:MQ的好处到底有哪些?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...
事务机制:Redis能实现ACID属性吗?
ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性,begin,commit,回滚实现。 那么redis可以实现ACID吗,结论是不能完全保证。 首先要知道redis通过MULTI关键字开启事务,中间一系列操作,加到操作队列中并不执…...
阿里巴巴1688怎么做网站/长沙网站seo哪家公司好
1 网络IO模型 memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe传递给worker线程,进行读写IO,网络层使用libevent封…...
北京微信网站制作/网推资源渠道
这里的讲解很不错,适合作为入坑题: Hihocoder#1938 代码: #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define ms(a,x) memset(a,x,…...
工商网站做企业公示/抖音seo怎么做的
删除 ctrl d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl k 删除光标后面所有字符相当于VIM里d shift$ ctrl u 删除光标前面所有字符相当于VIM里d shift^ ctrl w 删除光标前一个单词相当于VIM里db ctrl y 恢复…...
个人作品集网站模板免费下载/荨麻疹怎么治疗能除根
https://blog.csdn.net/github_37512301/article/details/75675054 一、关联模型在关系型数据库中,表之间有一对一、一对多、多对多的关系。在 TP5 中,实现了ORM (Object Relational Mapping) 的思想,通过在模型中建立模型间的关联࿰…...
毕业设计做网站起个名字/公司网站注册流程和费用
字段不超过8000的话可以这样: update 表名 set 字段名replace(convert(varchar(8000),字段名),要替换的,替换为的) 转载于:https://www.cnblogs.com/alon/archive/2009/10/13/1582308.html...
微信红包开发平台/百度seo优化方案
一、DLL文件常识DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时&…...