Animation 通过参数按顺序控制动画师中的动画

Animation 通过参数按顺序控制动画师中的动画,animation,unity3d,Animation,Unity3d,所以我正在制作一个化身的动画,这个化身有自己的动画制作人,有状态等等。 当与道具交互时,道具本身有一个带有状态的动画师。在这两种情况下,我都通过animator中的参数(bool类型)转换到一些动画 例如,对于门,角色将具有“ISOPENGDOOR”,而门将具有“isOpen” 现在的问题是:当我在GO1上更改动画的值,然后在GO2上更改bool;第一个动画是否完成,然后第二个动画是否开始?因为在我的情况下,它不会发生;它们几乎同时开始 void OnTriggerEnter (collider

所以我正在制作一个化身的动画,这个化身有自己的动画制作人,有状态等等。 当与道具交互时,道具本身有一个带有状态的动画师。在这两种情况下,我都通过animator中的参数(bool类型)转换到一些动画

例如,对于门,角色将具有“ISOPENGDOOR”,而门将具有“isOpen”

现在的问题是:当我在GO1上更改动画的值,然后在GO2上更改bool;第一个动画是否完成,然后第二个动画是否开始?因为在我的情况下,它不会发生;它们几乎同时开始

void OnTriggerEnter (collider door)
{
    if (door.gameObject.tag=="door")
    {
         GOAnimator1.SetBool("isOpeningDoor", true);
         GOAnimator2.SetBool("isOpen", true);
    }
}

我相信我做错了,因为我更改了动画制作者的参数,但我没有检查动画是否结束;这是可能的还是我在做一些不符合犹太教义的事情?

我真的认为这是可行的

正如您现在在代码中看到的,GO1和GO2上的动画几乎同时开始,因为这就是它的编写方式。函数将在调用的帧中完成执行,并将控件返回Unity

我认为,在游戏对象之间进行协作和发送消息可能会对您有所帮助:

其想法是:

  • 在GO2中创建一个协程,等待一段时间,直到它设置GOAnimator2变量以激活门动画
  • 在GO2中创建一个调用上述协程的函数
  • 从OnTiggerEnter()向GO2发送消息以执行新创建的函数
  • 它读起来很复杂,但相当简单。执行过程如下:

    1.协同程序的代码:

        function GO2coroutine(){
          float timeToWait = 0.5f; //Tweak this
          for ( float t = 0f; t < timeToWait; t+=time.deltaTime)
            yield; 
          GetComponent<Animator>().SetBool("isOpen",true);
        }
    
  • 以及OnTiggerEnter()的代码修改:

  • 我没有机会测试代码,所以请不要复制粘贴它,可能会有轻微的更改

    还有另一种方法,但我不太喜欢。那就是让动画更长时间处于空闲状态,等待第一个游戏对象动画结束。。。但是,如果你不得不缩短动画,或者有任何其他模型或事件,这将是一个麻烦


    不管怎么说,我认为我们的方式是合作!祝你好运

    谢谢你的回复。你的方法有一个基本问题:你在动画师中设置了一个变量,触发了动画;如果在触发动画后移动代理;它将在移动和完成动画时滑动。使用协同程序的正确方法是在您更改动画师中的bool之后调用wait,因为协同程序与主循环并行工作,并且当动画执行时,您可以实际设置允许动画完成的等待。这是我正在使用的实际方法,但它非常不可靠。
    function callCoroutine() {
      StartCoroutine("Fade");
    }
    
    void OnTriggerEnter (collider door)
    {
        if (door.gameObject.tag=="door")
        {
             GOAnimator1.SetBool("isOpeningDoor", true);
             GO2.SendMessage("callCoroutine");
        }
    }