4

ゲームオブジェクトを位置 A から BVector3.MoveTowardsに x 秒以内に、コルーチン関数で移動したいと考えています。これを行う方法は知っていますが、両方の関数の動作が異なるため、Vector3.Lerp今回は で行うことをお勧めします。Vector3.MoveTowards

では、これVector3.Lerpは次のように行われます。

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

で同じことをしようとしましたが、Vector3.MoveTowards正しく動作しません。問題は、移動が x 時間または期間の前に終了することです。また、スムーズに動かない。位置 B の最後ではなく、両方の位置の中間にジャンプします。

Vector3.MoveTowardsこれは、上記の問題で使用する関数です。

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

Vector3.MoveTowardsx秒以内にコルーチン関数でゲームオブジェクトを位置AからBに移動するにはどうすればよいですか?

Vector3.Lerpそれは私が使いたいものではないので、提案しないでください。

編集

交換する

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

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

動作しますが、フォーカスが Unity から別のアプリケーションに移動すると問題が発生します。動きが終わらない原因になります。タイマーを開始する前に、1 回ではなくフレームごとに計算する方が合理的です。

MatrixTai の回答により、両方の問題が解決されました。

4

1 に答える 1