【问题标题】:Object moves instantly to new position even with very low speed即使速度非常低,物体也会立即移动到新位置
【发布时间】:2016-11-13 06:12:25
【问题描述】:

我想将一个对象从他的原始位置缓慢移动到更高一点的位置,但是即使我使用像 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;
    }

【问题讨论】:

  • 显然寻求帮助意味着我不是 C# 或 Unity 方面的专家。与其指出我是菜鸟,你建议的代码比我的更好。

标签: c# unity3d


【解决方案1】:

但是这段代码会立即将对象移动到最高位置 当我使用像 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));

【讨论】:

  • 你的第一个代码工作正常,我以低速为例来检查它是否工作。我现在使用 liftSpeed * Time.deltaTime
【解决方案2】:

你在这里使用了一个不正确的地方的while循环。

只要语句为真,循环就会在一帧内继续执行。 这意味着无论您的幅度乘数有多低(0.001f),都只需要在同一帧中进行更多次迭代即可达到目标。

您应该检查每一帧对象是否已达到其目标,以及是否尚未应用转换。

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多