物体即使以非常低的速度也会立即移动到新的位置

本文关键字:移动 位置 速度 非常低 | 更新日期: 2023-09-27 18:17:50

我想把一个对象慢慢地从他的原始位置移动到更高一点的位置,但这段代码立即将对象移动到最高的位置,即使我使用非常慢的速度,如0.0001f。我在另一个代码中调用LiftObj() 1次,我告诉它运行,直到它达到liftOffset。这段代码有什么问题?

    void LiftObj(GameObject Obj) {
    float origianlPos = Obj.transform.position.y;
    while (Obj.transform.position.y < origianlPos + liftOffset) {
        Obj.transform.position += Vector3.up * 0.0001f;
        float newPos = Obj.transform.position.y;
        newPos = Mathf.Clamp (newPos, newPos, newPos + liftOffset);
        Obj.transform.position += Vector3.up * 0.0001f;
    }

物体即使以非常低的速度也会立即移动到新的位置

,但这段代码立即将对象移动到最高位置当我使用非常慢的速度,比如0.0001f。

你根本就没有在等。无论变量有多低,while循环都会尽可能快地执行。您应该在协程函数中执行此操作,然后等待yield关键字yield return null

IEnumerator LiftObj(GameObject Obj)
{
    float origianlPos = Obj.transform.position.y;
    while (Obj.transform.position.y < origianlPos + liftOffset)
    {
        Obj.transform.position += Vector3.up * 0.0001f;
        float newPos = Obj.transform.position.y;
        newPos = Mathf.Clamp(newPos, newPos, newPos + liftOffset);
        Obj.transform.position += Vector3.up * 0.0001f;
        yield return null;
    }
    Debug.Log("Done Moving Up!");
}

然后用:

移动
StartCoroutine(LiftObj(myGameObject));

甚至不确定这会像预期的那样工作,因为你缺少Time.delta,所以运动可能不顺利。如果您想做的只是从一个位置移动到另一个位置,请使用下面的示例代码:

IEnumerator LiftObj(GameObject playerToMove, Vector3 toPoint, float byTime)
{
    Vector3 fromPoint = playerToMove.transform.position;
    float counter = 0;
    while (counter < byTime)
    {
        counter += Time.deltaTime;
        playerToMove.transform.position = Vector3.Lerp(fromPoint, toPoint, counter / byTime);
        yield return null;
    }
}

4秒内从当前myGameObject位置移动到Vector3(0, 5, 0):

StartCoroutine(LiftObj(myGameObject, new Vector3(0, 5, 0), 4));

你在错误的地方使用了while循环。

While循环在一帧内继续执行,只要语句为真。这意味着无论你的星等乘数有多低(0.001f),它都需要在同一帧中进行更多的迭代才能达到目标。

你应该检查每一帧对象是否已经到达目标,如果它还没有应用转换。