随着时间的推移,Unity协同运动不一致/不准确



我有一个协同程序,每当玩家到达游戏中的某个点时,它就会向上移动我的相机。我使用了一个协同程序,这样相机就会随着时间的推移平稳移动。

以下是我的代码片段:

private IEnumerator MoveCameraUpCoroutine(Vector3 startPos, Vector3 endPos, float duration)
    {
        float elapsedTime = 0;
        while(elapsedTime < duration)
        {
            transform.position = Vector3.Lerp(startPos, endPos, (elapsedTime/duration));
            elapsedTime += Time.deltaTime;
            yield return null;
        }
    }
public void MoveCameraUp(Vector3 startPos, Vector3 endPos, float duration)
    {
        StartCoroutine(MoveCameraUpCoroutine(startPos, endPos, duration));
    }

在我的控制器脚本中,我只是这样调用我的协同程序:

        cam.GetComponent<CameraMovement>().MoveCameraUp(cam.transform.position,
                                                        new Vector3(cam.transform.position.x, cam.transform.position.y + setupLevel.heightOfBlock, cam.transform.position.z),
                                                        0.1f);

这样做的问题是,相机的运动在应该停止的地方并不总是一致的。我做了一些调试。在第一次运行时,摄影机移动到0.7864508 yPos。在第二次运行时,摄影机移动到0.7789915 yPos。等等。这是不一致的。

但当我简单地使用Translate而不是我的协同程序时:

cam.transform.Translate(0, setupLevel.heightOfBlock, 0);

我在0.7876318上获得了相机yPos的一致最终值,这正是我所需要的。但这个代码并不能随着时间的推移平稳地移动相机,这不是我想要的。

有人知道如何解决这个协同程序的问题吗?我不知道,但我认为我的协同程序代码有问题。非常感谢您的帮助。

结果实际上与预期非常一致。你的代码绝对没有错,而是因为帧速率的差异。

您之所以看到这些细微的差异,是因为无法保证两个帧会花费准确的渲染时间。看看这条

elapsedTime += Time.deltaTime;

您在这里所做的是给您的运行时间添加一个不一致的值。(即Time.deltaTime每帧都不同)。

一个部分修复方法可能是使用Time.smoothDeltaTime,它是deltaTime在多个帧上的平滑值。然而,这并不完美。

第二种方法(本身不完全是一个答案,但我也把这个留给其他人)是使用推特引擎,如DoTweenor iTween。这些引擎有一些方法,基本上可以做你想做的事情。

    float elapsedTime = 0;
    float ratio = elapsedTime / duration;
    while(ratio < 1f)
    {
        elapsedTime += Time.deltaTime;
        ratio = elapsedTime / duration;
        transform.position = Vector3.Lerp(startPos, endPos, ratio);      
        yield return null;
    }

使用此设置,循环将一直运行到比率为1。当为1时,返回endPos,循环退出下一轮。

我认为问题在于你要比较经过的时间和持续时间。所以在最后一次跑步中,你移动,然后增加,然后进行比较。因此,最后一次增长没有被考虑在内,你最终会在接近尾声的地方,但不会在末尾。

最新更新