Unity3d C#使用DOTween插件的Sequence实现系列动画OnComplete无效和颜色设置无效的问题记录

文章讲述了在Unity3D中使用DOTween插件创建文字打字、缩放和颜色变化的动画效果时遇到的问题,包括OnComplete函数不执行和颜色设置无效。作者通过调试和实验发现,OnComplete函数的层级放置错误以及DOColor动画的duration影响了颜色设置。解决方案是将OnComplete函数放在正确层级并调整DOColor的duration,确保在动画结束后能正确重置属性。
摘要由CSDN通过智能技术生成

前言

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

LayeredForm : 支持窗体动画特效,透明,可以和LayeredControl实现任意透明效果等。。。包含LayeredWindowForm的功能 支持一部分带有Paint事件的普通控件,但是不能实现普通控件的背景透明效果! 控件类:Controls HotKey:支持全局热键绑定,事件驱动,可以开启和关闭 LayeredButton:按钮控件,支持按钮颜色设置,图片按钮,如果只设置一张正常状态下的按钮图片,则有鼠标移入加亮效果和鼠标按下变暗效果。边框设置,文字效果设置。 LayeredCheckButton:对LayeredButton的扩展,支持状态切换。 LayeredDragBar:支持对父容器的尺寸拖拽调整 LayeredFlashBox:支持透明Flash播放(当前版本不可用,请勿使用!) LayeredLabel:对文字的显示,文字效果设置 LayeredListBox:支自定义列表项目,支持横向和纵向滚动,支持平滑滚动。 LayeredPanel:在Layered模式下的容器控件 LayeredPictureBox:支持Gif 播放,支持多张图片合成动画播放。播放Gif时候不要频繁暂停和播放动画,容易导致线程阻塞。 LayeredTextBox:Layered模式下的文本编辑器。支持水印文字设置 LayeredTrackBar:进度条控件,支持图片进度条定义 动画类:Animations 通过设置LayeredForm的Animation.Effect属性来定义窗体动画特效。 包含了以下特效类:BlindWindowEffect、FadeinFadeoutEffect、GradualCurtainEffect、LevelScrollEffect、RandomCurtainEffect、RotateZoomEffect、ThreeDTurn、ZoomEffect 可以通过实现IEffects接口来实现自定义特效 DirectUI类:DirectUI 包含几个DirectUI控件。用于对以上控件的扩展和美化。部分LayeredControl包含DUIControl属性可以向其添加DirectUI控件。支持通过集合编辑器里面添加,只是不能在集合编辑器里面绑定事件,需要手动写代码绑定。通过集合编辑器添加的控件不一定能马上在设计器里看到效果,因为会有图像缓存,可能需要尝试调整控件大小等方式强制控件重绘,就可以看到效果了。 LayeredControl可以支持在普通窗体上使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十幺卜入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值