0

time4 列のデータ、idxおよびzid を持つ車が特定の時間idに位置する道路網を走行する車をシミュレートしています。サンプルは次のとおりです。x,0,zt

t   id  x   z
957,1,-1.50,250.07
958,1,-1.50,232.39
959,1,-4.50,209.72
960,1,-4.50,193.05
961,1,-4.50,176.39
962,1,-4.50,159.72
963,1,-4.50,143.05
...

現時点では、車をスポーンし、時間の経過とデータに従って位置を更新することができます。車がポイントからポイントへ飛び出すのではなく、車の動きをよりリアルにシミュレートする方法にこだわっています。

私は使用していますVector.Lerpが、一貫したスムーズな動きなしでジャンプします:

car.transform.position = 
    Vector3.Lerp(car.transform.position, nextPosition, Time.deltaTime);

毎秒、上記のデータをチェックして、現在の秒における車の座標を見つけます。これらの座標はnextPosition上記のLerp関数にそのまま渡されます。これは、車が毎秒ポイントからポイントへ「Lerping」していることを意味します。

動きをスムーズにするにはどうしたらいいですか?位置の更新は毎秒行われるため、車は 1 秒以内に次の位置に到達する必要があります。

4

1 に答える 1

2

moveToXオブジェクトを x 秒以内の位置に移動する関数を使用する必要があります。これにより、この全体が簡素化されます。あとは、リスト内の各位置をループしmoveToX、オブジェクトがそこにある必要がある時間 (1 秒) を関数と提供するだけです。

このmoveToX関数Time.deltaTimeは、指定されたターゲット時間に達するまでカウンター変数をインクリメントするために使用することによって機能します。はt、そのカウンターを目標時間で割ることによって計算され0ます。1これtは、Vector3.Lerp期待どおりであるためです。コルーチンは関数内での待機を簡素化するため、これらはすべてコルーチン関数で実行する必要があります。

public GameObject car;
public List<Vector3> pos;
bool isMoving = false;

IEnumerator MoveCar()
{
    //Loop over each postion
    for (int i = 0; i < pos.Count; i++)
    {   
        //Get next position
        Vector3 nextPosition = pos[i];
        //Move to new position within 1 second
        yield return StartCoroutine(moveToX(car.transform, nextPosition, 1.0f));
    }
}

次に、コルーチン関数を呼び出して移動を開始できます。

void Start()
{
    StartCoroutine(MoveCar());
}
于 2018-06-05T19:55:26.297 に答える