LoginSignup
2
1

More than 1 year has passed since last update.

Unityで自動運転の車をバックさせる

Posted at

概要

Unityで車のゲームを作成しています。
Unity Standard Aseetsのカーオブジェクトで,自動運転ができる,CarWayPointBasedを使用しています。
しかし,下のgifファイルの赤い車のように,前から壁などにぶつかると,そのまま進もうとして,動けなってしまいました。

復帰なし.gif

バック

CarAIControl.csのFixedUpdate関数ないにある
m_CarController.Move(steer, accel, accel, 0f);

m_CarController.Move(-steer, -accel, -accel, 0f);
に変更することで,CarWayPointBasedのカーオブジェクトをバックさせることができました。

バック gif.gif

タグ付け

wallタグ.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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1