代码之家  ›  专栏  ›  技术社区  ›  Programmer

使用movetoward和duration代替speed

  •  3
  • Programmer  · 技术社区  · 7 年前

    我想搬家 游戏对象 从A位置到B位置 Vector3.MoveTowards 在x秒内,在一个协程函数中。我知道怎么做 Vector3.Lerp 但这次我更愿意 矢量3.移向 因为两种功能的表现不同。

    矢量3.lerp ,这样做就像 this 以下内容:

    IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
    {
        float counter = 0;
    
        //Get the current position of the object to be moved
        Vector3 startPos = fromPosition.position;
    
        while (counter < duration)
        {
            counter += Time.deltaTime;
            fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
            yield return null;
        }
    }
    

    我也试着做同样的事 矢量3.移向 ,但工作不正常。问题是移动在x时间或持续时间之前完成。而且,它移动不平稳。它跳到两个位置的中间,而不是位置b的末端。

    这是使用 矢量3.移向 关于上述问题:

    IEnumerator MoveTowards(Transform objectToMove, Vector3 toPosition, float duration)
    {
        float counter = 0;
    
        while (counter < duration)
        {
            counter += Time.deltaTime;
            Vector3 currentPos = objectToMove.position;
            float time = Vector3.Distance(currentPos, toPosition) / duration;
    
            objectToMove.position = Vector3.MoveTowards(currentPos, toPosition,
             time);
    
            Debug.Log(counter + " / " + duration);
            yield return null;
        }
    }
    

    你如何用 矢量3.移向 在X秒内和一个协程函数中?

    请不要建议 矢量3.lerp 因为那不是我想用的。

    编辑 以下内容:

    更换

    float time = Vector3.Distance(currentPos, toPosition) / duration;
    

    具有

    float time = Vector3.Distance(startPos, toPosition) / (duration * 60f);
    

    但当焦点从unity转移到另一个应用程序时会引入一个问题。这样做会导致运动无法完成。每帧计算一次而不是在开始计时之前计算一次似乎更合理。

    Matrixtai的答案解决了这两个问题。

    1 回复  |  直到 7 年前