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

时间:2016-03-31 05:19:51

标签: animation unity3d

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

例如,对于一个门,角色将具有“isOpeningDoor”,而门将具有“isOpen”。

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

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

我相信我做错了,因为我更改了动画师的参数,但我没有检查动画结束;这是不可能的,还是我做的不是犹太人?

1 个答案:

答案 0 :(得分:0)

我真的认为这可能是可行的!

正如你现在在代码中所拥有的那样,GO1和GO2上的动画几乎同时开始,因为这是它的编写方式。 OnTriggerEnter()函数将在调用它的帧中完成执行,并将控件返回给Unity。

我认为可以帮助你的是游戏对象之间的协同程序和sendMessage:

这个想法是:

  1. 在GO2中创建一个协程,等待一段时间,直到设置GOAnimator2变量以激活门动画。
  2. 在GO2中创建一个调用上述协同程序的函数
  3. 从OnTriggerEnter()发送消息到GO2以执行新创建的功能
  4. 它看起来很复杂,但它相当简单。执行将是这样的:

    1.协程代码:

        function GO2coroutine(){
          float timeToWait = 0.5f; //Tweak this
          for ( float t = 0f; t < timeToWait; t+=time.deltaTime)
            yield; 
          GetComponent<Animator>().SetBool("isOpen",true);
        }
    
    1. 调用它的函数的代码:

      function callCoroutine() {
        StartCoroutine("Fade");
      }
      
    2. OnTriggerEnter()的代码修改:

      void OnTriggerEnter (collider door)
      {
          if (door.gameObject.tag=="door")
          {
               GOAnimator1.SetBool("isOpeningDoor", true);
               GO2.SendMessage("callCoroutine");
          }
      }
      
    3. 我没有机会测试代码,所以请不要复制粘贴代码,可能会有轻微的修改。

      还有另一种方式,但我不喜欢它。这使动画更长时间处于空闲状态,等待第一个游戏对象动画结束...但是如果您因为必须或有任何其他模特或事件而缩短动画,那将是一件麻烦事。

      无论如何,我认为要走的路是协同程序!祝你好运!