概要
Unityで車のゲームを作成しています。
Unity Standard Aseetsのカーオブジェクトで,自動運転ができる,CarWayPointBasedを使用しています。
しかし,下のgifファイルの赤い車のように,前から壁などにぶつかると,そのまま進もうとして,動けなってしまいました。
バック
CarAIControl.csのFixedUpdate関数ないにある
m_CarController.Move(steer, accel, accel, 0f);
を
m_CarController.Move(-steer, -accel, -accel, 0f);
に変更することで,CarWayPointBasedのカーオブジェクトをバックさせることができました。
タグ付け
コースのガードレールの役割として,Cubeオブジェクトを使用していますが,このタグをwallに変更します。
大まかな流れ
今回は,CarWayPointBasedのカーオブジェクトがぶつかったオブジェクトのタグの名前がwallだった場合,カーオブジェクトをバックさせる形とします。
プログラム
CarAIControl.csのクラス上で,二つの変数を宣言します。。
wallタグに変更したCubeオブジェクトに,ぶつかった時に,trueに変更するwall_touch変数と,
ぶつかったあと,何秒かバックするため,Stopwatchクラスからtime変数を宣言します。
bool wall_touch = false;
Stopwatch time = new Stopwatch();
CarAIControl.cs内に既にあるOnCollisionStay関数に,ソースコードを付け足します。
ぶつかったオブジェクトの名前がwallだった場合,wall_touchの値をfalseからtrueに変更し,
time変数の計測をスタートします。
if (col.gameObject.tag == "wall")
{
wall_touch = true;
time.Start();
}
そして,FixedUpdate関数で,wall_touchの値がtrueだった場合,バックをおこない,3秒たったら,wall_touchの値をfalseに戻し,time変数を初期化し,普通の自動運転に戻る(elseの部分が実行される)仕様にしました。
if (wall_touch)
{
m_CarController.Move(-steer, -accel, -accel, 0f);
if (time.Elapsed > TimeSpan.FromSeconds(3))
{
time.Stop();
wall_touch = false;
time = new Stopwatch();
}
//Debug.Log(time.Elapsed);
//Debug.Log(wall_touch);
}
else
{
m_CarController.Move(steer, accel, accel, 0f);
}
テスト
実際に,自動運転している赤い車を壁にぶつけてました。
バックした後,普通に走りだしたので,やりたかったことはできたと思います。
参考にさせていただいたWebサイト
Unity Documentation スクリプトリファレンス Collider.OnCollisionStay(Collision)
https://docs.unity3d.com/ja/current/ScriptReference/Collider.OnCollisionStay.html