unity ngui onFinished.Clear()失效
今天在项目中遇到一个有意思的事情。有个需求是TweenAlpha动画。先调用隐藏动画后再调用一个方法,紧接着调用显示动画。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private void PlayAnim( bool show) { TweenAlpha anim = transform.GetComponent<TweenAlpha>(); if (anim != null ){ anim. from = bg.alpha; anim.to = show ? 1f : 0f; anim.onFinished.Clear(); if (show == false ){ anim.onFinished.Add( new EventDelegate(AnimCallBack)); } anim.ResetToBeginning(); anim.PlayForward(); anim.enabled = true ; } } public void AnimCallBack() { PlayAnim( true ); } |
当我调用PlayAnim(false);的时候 这个动画就开始一直在循环播放。一直不会停!!!(此类情况,只是出现在动画播放回调里面又调用该动画播放才会出现这种情况!!! 我用的是unity5.5.1.查了下源码。其实是因为里面还有个mTemp没有清空的原因)。
但是当我修改了一下上面的代码。动画又正常了。按照我想的去播放了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | private void PlayAnim( bool show) { TweenAlpha anim = transform.GetComponent<TweenAlpha>(); if (anim != null ){ anim. from = bg.alpha; anim.to = show ? 1f : 0f; anim.onFinished.Clear(); if (show == false ){ anim.onFinished.Add( new EventDelegate(AnimCallBack)); } anim.ResetToBeginning(); anim.PlayForward(); anim.enabled = true ; } } public void AnimCallBack() { Invoke( "Anim_Show" , 0.001f); } public void Anim_Show() { PlayAnim( true ); } |
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void PlayAnim( bool show) { TweenAlpha anim = transform.GetComponent<TweenAlpha>(); if (anim != null ){ anim. from = bg.alpha; anim.to = show ? 1f : 0f; if (show == false ){ anim.OnFinishAction = AnimCallBack; } else { anim.OnFinishAction = null ; } anim.ResetToBeginning(); anim.PlayForward(); anim.enabled = true ; } } public void AnimCallBack() { PlayAnim( true ); } |
这样也是正常播放的 不会一直循环下去!!!
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void PlayAnim( bool show) { TweenAlpha anim = transform.GetComponent<TweenAlpha>(); if (anim != null ){ anim. from = bg.alpha; anim.to = show ? 1f : 0f; if (show == false ){ anim.onFinished.Add( new EventDelegate(AnimCallBack)); } else { anim.RemoveOnFinished( new EventDelegate(AnimCallBack)); } anim.ResetToBeginning(); anim.PlayForward(); anim.enabled = true ; } } public void AnimCallBack() { PlayAnim( true ); } |
这样也是正常播放的 不会一直循环下去!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!