C# 变换位置未立即更新

C# 变换位置未立即更新,c#,unity3d,C#,Unity3d,我制作了一个动画事件,一旦动画完成,它会更新变换位置,然后调用一个方法来检查播放器是否落在特定的瓷砖上 但是,变换位置没有立即更新。我写了一个合作计划来等待一小段时间 一个简单的例子: public void OnAnimationFinish() { transform.position = landOn; Debug.Log("Start from: " + landOn); JumpIfOnTile(); } private void JumpIfOnTile(

我制作了一个动画事件,一旦动画完成,它会更新变换位置,然后调用一个方法来检查播放器是否落在特定的瓷砖上

但是,变换位置没有立即更新。我写了一个合作计划来等待一小段时间

一个简单的例子:

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);
}

尝试在
JumpIfOnTile()之前设置一个条件已执行。e、 g

public void OnAnimationFinish() {
    transform.position = landOn;
    Debug.Log("Start from: " + transform.position);

    if(transform.position == landOn)
    JumpIfOnTile();
}
我迷上了最后一帧的动画。理论上 应该制作动画

看起来动画并没有真正完成,而是覆盖了设置给对象的位置。不要等待非常长的
.5f
秒,而是等待动画可能完成时的帧结束,这是使用
yield return new WaitForEndOfFrame()
完成的。如果仍然存在问题,只需等待
返回null的帧即可

虽然这可以解决您的问题,但我不建议您使用内置动画事件来检测动画的结束,只需通过代码即可。请参阅my other中的
play和waitforanim
功能,该功能显示如何播放动画,然后等待动画播放完成。将转换移动到
play和waitforanim
函数的末尾

编辑:

为什么我要等一帧

记得我说过你可以用
WaitForEndOfFrame
等待帧结束,或者等待帧结束。Unity是每帧更新动画。由于已将事件设置为最后一帧,因此无法保证何时调用事件(在最后一帧之前或之后)。如果在帧之前调用事件并设置位置,则动画将在帧末尾覆盖该事件。这就是为什么要等到帧结束或只有一帧时才能保证动画不再动画化。观看视频以获得更多关于正在发生的事情的洞察力

为什么您更喜欢脚本而不是内置动画事件?它是 偶尔表现出人意料

我更喜欢为此编写脚本,因为它避免了与您的问题类似的问题。动画事件文档上应该有一个警告,上面写着“不要使用此”。动画事件可能会导致游戏出现缓慢的bug,并且此问题会随机发生。我不确定这个问题是否已经解决。它所能做的最糟糕的事情是根本不被调用,当动画由于低帧速率而错误地跳过一帧时,就会发生这种情况。他们声称他们已经解决了这个问题,但这是错误的。没有被调用的回调函数会完全破坏游戏


如果需要动画的回调类型事件,请在我链接的
play和waitforanim
函数中实现。不要使用Unity的动画事件。

您确定没有从其他地方调用
JumpIfonTile
?这似乎是不可能的,尤其是当
OnAnimationFinish
中的第一个
日志显示更新的
变换位置时。你能在
OnAnimationFinish
中设置一个断点并测试到底发生了什么吗?@MartinZikmund似乎将位置设置为
landOn
并没有实际更新位置。第一个
记录
是否输出
landOn
位置?@MartinZikmund实际上我打印了
landOn
。我编辑了这篇文章。动画也在修改位置吗?如果动画实际上还没有完全完成,它可能不允许您更新itI编辑的文章。在您的情况下,条件失败。感谢您的回复。它可能与这个问题没有直接关系,但你能解释更多关于1的内容吗。为什么我要等一帧?我假设一个事件系统正在轮询每个帧,并处理来自动画、脚本等的异步调用。;2.为什么您更喜欢脚本而不是内置动画事件?它是否偶尔表现得出人意料?我这样问是因为我还没有在官方网站上看到“最佳实践”。我也没有读过关于动画事件的完整解释。