Utilice MoveTowards con duración en lugar de velocidad

Quiero moverme GameObject de la posición A a la B conVector3.MoveTowards dentro de x segundos y en una función de rutina. Sé cómo hacer esto conVector3.Lerp pero esta vez preferiría hacerlo conVector3.MoveTowards ya que ambas funciones se comportan de manera diferente.

ConVector3.Lerp, esto se hace comoest:

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;
    }
}

Intenté hacer lo mismo conVector3.MoveTowards, pero no funciona correctamente. El problema es que el movimiento termina antes del tiempo o duración x. Además, no se mueve suavemente. Salta al centro de ambas posiciones que al final de la posición B.

Esta es la función que usaVector3.MoveTowards con el problema anterior:

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;
    }
}

¿Cómo mueves GameObject de la posición A a la B conVector3.MoveTowards dentro de x segundos y en una función de rutina?

Por favor no sugieraVector3.Lerp ya que eso no es lo que quiero usar.

EDITA:

Reemplazando

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

co

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

works pero presenta un problema cuando el foco se cambia de Unity a otra aplicación. Hacer eso hace que el movimiento no termine. Calcularlo cada fotograma en lugar de una vez antes de iniciar el temporizador parece más razonable.

a respuesta de MatrixTai solucionó ambos problemas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta