zoukankan      html  css  js  c++  java
  • 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);
        }
    

      

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

  • 相关阅读:
    QT 捕获事件(全局拦截)
    QT语言翻译
    QT,QLabel添加超链接
    解决VS+Qt不生成moc文件问题
    c++编译错误:invalid new-expression of abstract class type
    C++ 异常处理
    MATLAB 随机生成互不重叠的多个矩形
    sequential minimal optimization,SMO for SVM, (MATLAB code)
    How to decide on the correct number of clusters?
    python 将数据随机分为训练集和测试集
  • 原文地址:https://www.cnblogs.com/Colored-Mr/p/8577282.html
Copyright © 2011-2022 走看看