所以我正在制作一个头像的动画,这个头像有自己的动画师和状态等等。当与道具交互时,道具本身有一个带有状态的动画器。在这两种情况下,我都会通过动画生成器中的参数(bool类型)转换到一些动画。
例如,对于门,字符将具有"isOpeningDoor",而门将具有"isOpen“。
现在的问题是:当我在GO1上更改动画设计器的值,然后在GO2上更改布尔值时,第一个动画结束,然后第二个动画开始吗?因为在我的情况下,它不会发生;它们几乎同时开始。
void OnTriggerEnter (collider door)
{
if (door.gameObject.tag=="door")
{
GOAnimator1.SetBool("isOpeningDoor", true);
GOAnimator2.SetBool("isOpen", true);
}
}我相信我做错了,因为我改变了动画师的参数,但我没有检查动画是否结束;这是可能的吗,或者我做了一些不合乎礼仪的事情?
发布于 2016-04-01 16:44:59
我真的认为这可能是可行的!
正如您现在在代码中看到的那样,GO1和GO2上的动画几乎同时启动,因为这就是它的编写方式。OnTriggerEnter()函数将在它被调用的框架中完成执行,并将控制返回给Unity。
我认为可能对你有帮助的是游戏对象之间的协程和sendMessage:
这个想法是为了:
它读起来很复杂,但却相当简单。执行过程如下所示:
1.协程的代码:
function GO2coroutine(){
float timeToWait = 0.5f; //Tweak this
for ( float t = 0f; t < timeToWait; t+=time.deltaTime)
yield;
GetComponent<Animator>().SetBool("isOpen",true);
}调用它的函数的
function callCoroutine() { StartCoroutine("Fade");}
OnTriggerEnter (碰撞门){ if (door.gameObject.tag=="door") { GOAnimator1.SetBool("isOpeningDoor",true);GO2.SendMessage("callCoroutine");} }
我没有机会测试代码,所以请不要复制粘贴它,可能会有一些细微的变化。
还有另一种方法,但我不太喜欢它。使动画更长,处于空闲状态,等待第一个游戏对象动画结束……但这将是一个麻烦的情况下,你缩短了动画,因为你必须,或有任何其他模型或事件。
不管怎么说,我认为最好的方法是使用协程!祝好运!
https://stackoverflow.com/questions/36324740
复制相似问题