所以我正在为一个化身制作动画,而这个化身有自己的动画师,有状态等等。 在与道具交互时,道具本身就有一个动画师,里面有状态。在这两种情况下,我都通过动画师(bool类型)中的参数过渡到一些动画。
例如,对于一个门,角色将具有“isOpeningDoor”,而门将具有“isOpen”。
现在的问题是:当我更改GO1上动画师的值,然后更改GO2上的bool;做第一个动画完成,然后第二个开始?因为在我的情况下,它不会发生;他们几乎同时开始。
void OnTriggerEnter (collider door)
{
if (door.gameObject.tag=="door")
{
GOAnimator1.SetBool("isOpeningDoor", true);
GOAnimator2.SetBool("isOpen", true);
}
}
我相信我做错了,因为我更改了动画师的参数,但我没有检查动画结束;这是不可能的,还是我做的不是犹太人?
答案 0 :(得分:0)
我真的认为这可能是可行的!
正如你现在在代码中所拥有的那样,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()的代码修改:
void OnTriggerEnter (collider door)
{
if (door.gameObject.tag=="door")
{
GOAnimator1.SetBool("isOpeningDoor", true);
GO2.SendMessage("callCoroutine");
}
}
我没有机会测试代码,所以请不要复制粘贴代码,可能会有轻微的修改。
还有另一种方式,但我不喜欢它。这使动画更长时间处于空闲状态,等待第一个游戏对象动画结束...但是如果您因为必须或有任何其他模特或事件而缩短动画,那将是一件麻烦事。
无论如何,我认为要走的路是协同程序!祝你好运!