动画制作完成后,我创建了一个动画事件,它会更新变换位置,然后调用一种方法来检查玩家是否在特定图块上着陆。
但是,变换位置没有立即更新。我写了一个协程,等待一会儿。
一个简单的例子:
public void OnAnimationFinish() {
transform.position = landOn;
Debug.Log("Start from: " + landOn);
JumpIfOnTile();
}
private void JumpIfOnTile() {
// not same if you don't wait
Debug.Log("Start from: " + transform.position);
}
解决方法:
private IEnumerator JumpIfOnTile() {
yield return new WaitForSeconds(.5f);
// then everything ok
Debug.Log("Start from: " + transform.position);
}
答案 0 :(得分:2)
我在最后一帧上钩了OnAnimationFinish。从理论上讲 动画应该完成。
看起来动画没有真正完成,并且正在覆盖您设置给对象的位置。不用等待很长的.5f
秒,而可以在动画很可能完成并且等待yield return new WaitForEndOfFrame()
时等待帧结束。如果仍然存在问题,请等待yield return null
的帧。
尽管这可以解决您的问题,但我不建议您使用内置的动画事件来检测动画的结束,而只需通过代码即可。请参见我的其他post中的PlayAndWaitForAnim
函数,其中显示了如何播放动画,然后等待动画完成播放。在该PlayAndWaitForAnim
函数的末尾移动转换。
编辑:
为什么我要等待一帧?
请记住,我说过可以等到WaitForEndOfFrame
结束帧或等待一帧。 Unity正在每帧更新动画。由于您已将事件设置为最后一帧,因此无法保证何时调用该事件(在最后一帧之前或之后)。如果在帧之前调用了事件,并且您设置了位置,则动画将在帧末尾将其覆盖。这就是为什么要等到一帧结束或仅一帧以确保动画不再进行动画处理的原因。观看this视频,以了解发生了什么。
为什么您更喜欢脚本而不是内置动画事件?是吗 偶尔表现异常?
我更喜欢为此编写脚本,因为它避免了问题中的问题。动画事件文档上应有一条警告,内容为“请勿使用此” 。动画事件可能会导致您的游戏出现缓慢的错误,并且此问题随机发生。我不确定这是否已解决。它不能做的最坏的事情是根本不被调用,当您的动画由于帧率低而错误地跳过一帧时,就会发生这种情况。他们声称已解决此问题,但问题是not true。不被调用的回调函数会完全破坏您的游戏。
如果您需要动画的回调类型事件,请在我链接的PlayAndWaitForAnim
函数中实现event and delegate。不要使用Unity的动画事件。
答案 1 :(得分:0)
尝试在执行JumpIfOnTile();
之前设置条件。例如
public void OnAnimationFinish() {
transform.position = landOn;
Debug.Log("Start from: " + transform.position);
if(transform.position == landOn)
JumpIfOnTile();
}