unity ngui onFinished.Clear()失效

今天在项目中遇到一个有意思的事情。有个需求是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);
    }

  

这样也是正常播放的   不会一直循环下去!!!

posted @ 2018-03-15 23:50  色色先生  阅读(811)  评论(0编辑  收藏  举报