概要
Unityで車のゲームを作成しています。 Unity Standard Aseetsのカーオブジェクトで,自動運転ができる,CarWayPointBasedを使用しています。 しかし,下のgifファイルの赤い車のように,前から壁などにぶつかると,そのまま進もうとして,動けなってしまいました。バック
CarAIControl.csのFixedUpdate関数ないにある m_CarController.Move(steer, accel, accel, 0f); を m_CarController.Move(-steer, -accel, -accel, 0f); に変更することで,CarWayPointBasedのカーオブジェクトをバックさせることができました。タグ付け
![wallタグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/3aa84fa6-24fa-d4bb-6582-a72ed32367df.png)コースのガードレールの役割として,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サイト
特定の時間ループを実行する方法 https://www.webdevqa.jp.net/ja/c%23/%E7%89%B9%E5%AE%9A%E3%81%AE%E6%99%82%E9%96%93%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/973216817/Unity Documentation スクリプトリファレンス Collider.OnCollisionStay(Collision)
https://docs.unity3d.com/ja/current/ScriptReference/Collider.OnCollisionStay.html