C# 统一-在没有物理的情况下将变换移动到特定位置(以特定速度)的最佳方法?

C# 统一-在没有物理的情况下将变换移动到特定位置(以特定速度)的最佳方法?,c#,unity3d,C#,Unity3d,我想知道我应该如何在不使用物理的情况下将变换移动到特定点 当前,我使对象查看目标位置: transform.LookAt(m_TargetPos, UnityEngine.Vector3.up); if ((transform.position - m_TargetPos).sqrMagnitude < 0.0025f) // 0.0025 = 0.05f * 0.05f return true; 然后我用一定的速度每帧更新它的位置: transform.positio

我想知道我应该如何在不使用物理的情况下将变换移动到特定点

当前,我使对象查看目标位置:

transform.LookAt(m_TargetPos, UnityEngine.Vector3.up);
if ((transform.position - m_TargetPos).sqrMagnitude < 0.0025f) // 0.0025 = 0.05f * 0.05f
        return true;
然后我用一定的速度每帧更新它的位置:

transform.position += transform.forward * (m_Speed * Time.deltaTime);
最后,我使用sqrMagnitude来确定变换是否达到以下位置:

transform.LookAt(m_TargetPos, UnityEngine.Vector3.up);
if ((transform.position - m_TargetPos).sqrMagnitude < 0.0025f) // 0.0025 = 0.05f * 0.05f
        return true;
我面临的问题是,有时实体会超越目标位置,永远向前推进

我应该如何对条件进行编码,使其永远不会超出目标位置

提前感谢。

使用最终避免超调的:

计算当前和目标指定的点之间的位置,移动距离不超过maxDistanceDelta指定的距离

用于检查您是否已经到达该位置,您可以使用

其精度为1e-5,因此等于使用0.00001的阈值

最终避免超调的使用:

计算当前和目标指定的点之间的位置,移动距离不超过maxDistanceDelta指定的距离

用于检查您是否已经到达该位置,您可以使用

其精度为1e-5,因此等于使用0.00001的阈值


@Jichael这不是你使用Lerp thoughWoops的方式,写得太快了,你使用的增量是每帧递增的,我的错@Jichael这不是你使用Lerp thoughWoops的方式,写得太快了,你使用的增量是每帧递增的,我的错!谢谢你的回复,根据这个:你还需要检查距离吗?我会不会有和现在一样的问题?@Cris不一样。你还是得检查一下距离是的。但是MoveToward明确地避免了任何超调,因此您不必担心,只需在对象到达目标位置时进行检查。。如果你需要的话。非常感谢你的详细解释。MoveToward的工作很有魅力。谢谢你的回复,根据这个:你还需要检查距离吗?我会不会有和现在一样的问题?@Cris不一样。你还是得检查一下距离是的。但是MoveToward明确地避免了任何超调,因此您不必担心,只需在对象到达目标位置时进行检查。。如果你需要的话。非常感谢你的详细解释。他工作得很有魅力。
if(Vector3.Distance(transform.position, m_TargetPos) < 0.00001f)
    return true;
if(Vector3.Distance(transform.position, m_TargetPos) < 0.0025f)
    return true;
if(Vector3.Distance(transform.position, m_TargetPos) < 0.0000001f)
    return true;
// TODO: either block concurrent routines with a bool flag
// TODO: or stop the running routine before starting a new one
StartCoroutine(MoveTo(targetPosition, speed));

...

private IEnumerator MoveTo(Vector3 targetPos, float speed)
{
    var currentPos = transform.position;
    var distance = Vector3.Distance(currentPos, targetPos);
    // TODO: make sure speed is always > 0
    var duration = distance / speed;

    var timePassed = 0f;
    while(timePassed < duration)
    {
        // always a factor between 0 and 1
        var factor = timePassed / duration;

        transform.position = Vector3.Lerp(currentPos, targetPos, factor);

        // increase timePassed with Mathf.Min to avoid overshooting
        timePassed += Math.Min(Time.deltaTime, duration - timePassed);

        // "Pause" the routine here, render this frame and continue
        // from here in the next frame
        yield return null;
    }

    transform.position = targetPos;

    // Something you want to do when moving is done
}