首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在动画器中通过参数以序列方式控制动画

在动画器中通过参数以序列方式控制动画
EN

Stack Overflow用户
提问于 2016-03-31 13:19:51
回答 1查看 221关注 0票数 1

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

例如,对于门,字符将具有"isOpeningDoor",而门将具有"isOpen“。

现在的问题是:当我在GO1上更改动画设计器的值,然后在GO2上更改布尔值时,第一个动画结束,然后第二个动画开始吗?因为在我的情况下,它不会发生;它们几乎同时开始。

代码语言:javascript
复制
void OnTriggerEnter (collider door)
{
    if (door.gameObject.tag=="door")
    {
         GOAnimator1.SetBool("isOpeningDoor", true);
         GOAnimator2.SetBool("isOpen", true);
    }
}

我相信我做错了,因为我改变了动画师的参数,但我没有检查动画是否结束;这是可能的吗,或者我做了一些不合乎礼仪的事情?

EN

回答 1

Stack Overflow用户

发布于 2016-04-01 16:44:59

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

正如您现在在代码中看到的那样,GO1和GO2上的动画几乎同时启动,因为这就是它的编写方式。OnTriggerEnter()函数将在它被调用的框架中完成执行,并将控制返回给Unity。

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

  • http://docs.unity3d.com/Manual/Coroutines.html
  • http://docs.unity3d.com/ScriptReference/GameObject.SendMessage.html

这个想法是为了:

  • 在GO2中创建一个协程,它会等待一段时间,直到它设置GOAnimator2变量来激活门GO2中调用上述coroutine

  • From的函数OnTriggerEnter()向GO2发送一条消息以执行新创建的函数

它读起来很复杂,但却相当简单。执行过程如下所示:

1.协程的代码:

代码语言:javascript
复制
    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");}

  • 和OnTriggerEnter()的代码修改:

OnTriggerEnter (碰撞门){ if (door.gameObject.tag=="door") { GOAnimator1.SetBool("isOpeningDoor",true);GO2.SendMessage("callCoroutine");} }

我没有机会测试代码,所以请不要复制粘贴它,可能会有一些细微的变化。

还有另一种方法,但我不太喜欢它。使动画更长,处于空闲状态,等待第一个游戏对象动画结束……但这将是一个麻烦的情况下,你缩短了动画,因为你必须,或有任何其他模型或事件。

不管怎么说,我认为最好的方法是使用协程!祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36324740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档