zoukankan      html  css  js  c++  java
  • Unity Animator SetTrigger “不生效”的坑

    Unity Animator 的 SetTrigger 方法有一个小坑,就是快速调用SetTrigger,生效的可能不是最后调用的那个,要是不了解,出问题了会摸不着头脑。

    我遇到问题的场景:来回切换run和idle动作时,会出现本应该播放run的动作时,却播了idle的动作,从log上看又已经设置过run的trigger。刚开始很着急,完全不知道怎么回事,看上去是偶然的,很难复现。后面经过反复测试,发现快速切换run和idle会使出现问题的概率大大提高,会不会是上一个SetTrigger(idle)覆盖掉了SetTrigger(run)。于是就做了个小实验:

    1、直接在代码里同时调用多个SetTrigger;

    2、调用多次,但SetTrigger前先ResetTrigger;

    测试代码:

    //用临时变量保存trigger参数,并在播放之前把上一个trigger重置
    void
    SetTrigger(string trigger) { if (!string.IsNullOrEmpty(lastTrigger)) animator.ResetTrigger(lastTrigger); animator.SetTrigger(trigger); lastTrigger = trigger; }
    //直接连续调用
    public void TestTrigger1() { animator.SetTrigger(AniParam.Run_Trigger); animator.SetTrigger(AniParam.EnterIdle_Trigger); animator.SetTrigger(AniParam.Attack1_Trigger); animator.SetTrigger(AniParam.Attack2_Trigger); animator.SetTrigger(AniParam.Critl_Trigger); }
    //每次调用都重置
    public void TestTrigger2() { SetTrigger(AniParam.Run_Trigger); SetTrigger(AniParam.EnterIdle_Trigger); SetTrigger(AniParam.Attack1_Trigger); SetTrigger(AniParam.Attack2_Trigger); SetTrigger(AniParam.Critl_Trigger); } void Update() { if (Input.GetKeyDown(KeyCode.A)) TestTrigger1(); if (Input.GetKeyDown(KeyCode.D)) TestTrigger2(); }

    测试1,直接SetTrigger,看上去像是动画融合,而且也不是换调用顺序播放:

    测试2,先ResetTrigger,再SetTrigger,符合预期: 正常播放Critl:

    所以,为了避免SetTrigger异常,出现诡异情况,还是在SetTrigger之前先ResetTrigger吧。

  • 相关阅读:
    欢迎大家来到氨帝萝卜的博客园
    Java利用自定义注解、反射实现简单BaseDao
    spring boot 2.0.1.RELEASE版本之消息总线 ConfigClient配置自动刷新
    spring cloud eureka server之端口8889之谜
    关于spring cloud “Finchley.RC2”版本在spring cloud config中的ArrayIndexOutOfBoundsException
    关于中间件、J2EE的一些概念
    IP地址 子网掩码 默认网关 DNS(转)
    知识点大图
    Javascript是单线程的深入分析(转)
    SQL查询--选择运算(1)
  • 原文地址:https://www.cnblogs.com/yougoo/p/12392620.html
Copyright © 2011-2022 走看看