今天在项目中遇到一个有意思的事情。有个需求是TweenAlpha动画。先调用隐藏动画后再调用一个方法,紧接着调用显示动画。代码如下:
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没有清空的原因)。
但是当我修改了一下上面的代码。动画又正常了。按照我想的去播放了
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); }
或者
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); }
这样也是正常播放的 不会一直循环下去!!!
或者
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); }
这样也是正常播放的 不会一直循环下去!!!