Unity3d C#使用DOTween插件的Sequence实现系列动画OnComplete无效和颜色设置无效的问题记录
创始人
2025-05-28 18:43:18
0

前言

最近在弄一个文字动画效果的动画,使用了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测试再现问题,仅供参考。

相关内容

热门资讯

原创 左... 作者︱余在洋 与其抱怨环境糟糕,不如弯腰探求“活下来”的创新之道。就像上海这位面馆老板,他用“左手一...
股市必读:金博股份(68859... 截至2025年7月28日收盘,金博股份(688598)报收于27.23元,上涨0.67%,换手率2....
原创 高... 8天。2025年春节高速免费通行长达8天,7座及以下小客车全程免单。你是不是也想薅羊毛?想玩个骚操作...
标普500指数屡创新高,大型科... 21世纪经济报道记者舒晓婷 北京报道 受强劲业绩以及最新贸易动态提振,过去一周美国三大股指集体收涨。...
劲方医药再次冲刺港交所 核心产... 劲方医药科技(上海)股份有限公司(以下简称劲方医药)又一次向港交所发起冲刺,计划通过18A规则于主板...
工业硅、多晶硅:7月价格调整,... 【7月28日工业硅期货跌停,多晶硅价格下跌,市场情绪回落致价格大幅调整】7月28日,工业硅期货跌停,...
大赚超50亿!期货业上半年成绩... 【导读】全国期货公司上半年累计实现净利润50.74亿元 见习记者 舍梨 期货业上半年成绩单揭晓。 7...
赋能产业升级!逸马连锁产业集团... 深圳商报·读创客户端首席记者 刘琼 7月28日,由逸马连锁产业集团主办的“百亿连锁蛋糕·百路豪杰共享...
28日纸浆下跌1.72%,最新... 来源:新浪期货 新浪期货 根据交易所数据,截至7月28日收盘主力合约纸浆2509,涨跌-1.72%,...
美股民热衷“冷门潜力股” 近日,美股市场一甩二季度的阴霾。上周,标准普尔500指数上涨1.5%,至6389点,纳斯达克综合指数...
7月28日江特电机发布公告,股... 证券之星消息,7月28日江特电机发布公告《江特电机:详式权益变动报告书》,其股东王新于2025年2月...
无问芯穹CEO夏立雪:抵达AG... 新浪科技讯 7月28日下午消息,2025年世界人工智能大会期间,无问芯穹联合创始人、CEO夏立雪提出...
5名银行高管,密集履新佛山 南都N视频记者从国家金融监督管理总局广东监管局官网获悉,7月22日,佛山监管分局批复了5名银行高管在...
6G概念强势拉升,光迅科技、世... 6G概念28日盘中强势拉升,截至发稿,硕贝德涨近17%,兴森科技、直真科技、光迅科技、世嘉科技等均涨...
外交部回应长和新公告:将依法进... 7月28日,外交部发言人郭嘉昆主持例行记者会时,回应记者有关长和集团最新公告的提问时表示:“我们关注...
玉象胡杨硝酸铵首出国门,红其拉... 近日,两辆满载广东宏大(002683.SZ)控股企业雪峰科技(603227.SH)所属新疆玉象胡杨化...
原创 2... 雷达财经出品 文|彭程 编|孟帅 日前,被外界誉为港股“三朵金花”之一的老铺黄金,对外发布了正面盈利...
异地公积金贵阳买房攻略!手把手... 异地公积金 在贵阳买房攻略 贵阳的准业主们注意啦!2025年5月1日起,《贵阳市住房公积金异地个人...
开价185亿,刘强东竞买德国超... 来源:21世纪商业评论 作者:杨松 鄢子为 图源:京东 在境外,刘强东忙着物色标的。 7月24日,德...