Unity5で車の挙動をパパっと追加して乗り回す。ついでにAI Carも。
今回はUnityがSampleAssetsで提供している車の挙動について紹介します。
なおこの挙動はUnityの物理演算(主にWheel Collider)に従った挙動のため、マリオカートやF-ZEROのような、全体的に物理的ではない挙動を表現したい場合は、これを改造して作るより0から自分で挙動を書いたほうが良いかもしれません。
またレーシングゲームで使いたい場合、転覆したら戻す・もしくは絶対転覆しないように一定角度以上傾いたら強制的に戻すといった仕組みがひつようになるかもしれません。
目次
とりあえず車を走らせる
まずはStandardAssetsのVehiclesより、Carコンポーネントを含むコンポーネントを入手します。メニューバーのAssets>Import Package>Vehiclesでインポートできます。
もしImport Packageの中身がCustom Packageのみの場合、Standard Assetsがインストールされていません。その場合はインストーラーのStandard Assetsをインストールします。
パッケージをインポートすると、ProjectビューのStandardAssets>Vehiclesが追加されるので、StandardAssets>Vehicles>Car>PrefabsよりCarプレハブをドラッグ&ドロップしてシーンに登録します(以降、シーンにあるCarプレハブはCarオブジェクトとします)。
これで車が登録出来ました。後は適当にステージとか作って走らせれば、ゲーム内を車が走ります。
Sample Assetsのプロトタイプアセットを並べて簡単なステージを作ってみよう[Unity] - テラシュールブログ
ちなみに操作は、WSで前進後退、ADでハンドルです。スペースでブレーキ。
車をオリジナルカーにする
車を自分のオリジナルの車に変更します。今回はUnityの提供するShanty Town: SUVを使用します。なので、AssetStoreからダウンロードしておきます。
まずは先ほどシーンへ配置したCarオブジェクトのSkyCarオブジェクトを削除します。LosingPrefabとか言ってきますが、無視してContinueです。
次に先ほどインポートしたVEHICLE_SUVをSkyCarの代わりにCarオブジェクト以下に配置します。その際、VEHICLE_SUVのTransformのPositionは(x:0, y:0, z:0)に設定します。
また車の車輪をCarオブジェクトのCarControllerへ登録します。
CarControllerのWheelMeshesやWheel CollidersがNoneになっていると思いますので、先ほど登録したVEHICLE_SUVのタイヤ、SUV_wheel_front_left・SUV_wheel_frnot_right・SUV_wheel_rear_left・SUV_wheel_rear_rightにWheelColliderコンポーネントを追加して登録します。
車のホィールの位置を調整します。
CarプレハブのWheelsHubs以下のWheelHubFrontRightとWheelHubRearRightとWheelHubFrontLeftとWheelHubRearLeftをそれぞれ車のホィールの位置へ調整します。基本的な座標はとりあえずはTransformで調整して、ホィールの大きさはWheelColliderのRadius(半径)で調整します。
次にコライダーの大きさを調整します。このCarプレハブは所謂複合コライダーを使用しています。車の大きさに合うようにコライダーの位置や大きさを調整します。
コライダーはCarオブジェクト>Colliders以下のオブジェクトが管理しています。この中のコライダーを調整してもよいですし、新しく作っても良いです。計上に一致するように、コライダーの位置・サイズを調整します。
調整するには、「単純にTransformの位置・サイズ・大きさ」を調整するか、Colliderコンポーネントの「Edit Collider」をクリック後に緑の点をドラッグして調整します。
【Unity】Unity 4.6 変更点「Edit Collider」 - コガネブログ
最後にハンドルを回した際にタイヤが傾くようにします。
傾きを行ってくれるコンポーネントはMudguardです。これはCarの状態を確認し、傾きが発生していればタイヤを傾ける演出を行います。(つまり、傾いたから曲がるのではなく、曲がったから傾く感じです)
今回の場合 SUV_wheel_front_leftとSUV_wheel_front_rightの2つのタイヤが傾くと良い感じなので、この2つにMudguardを追加します。
SUV_wheel_front_leftとSUV_wheel_front_rightの両方を選択して、Add ComponentでMudguardを追加します。
最後に、MudguardのCarControllerにCarオブジェクトを登録します。
これでモデルの差替えは完了です。
AI Carによるルートの巡回について
Carフォルダ以下には、CarプレハブだけでなくCarWaypointBasedなるプレハブが存在します。これが何かと言えば、単純に言えば自動操縦が可能なCarです。
この機能はUtilityパッケージの中のWayPoint機能を使用します。このパッケージをインポートすると、Vehiclesパッケージで不足しているコンポーネントが補完され、CarWaypointBasedが完全なプレハブとなります。
Unityのunitypackage出力について - テラシュールブログ
CarWaypointBasedとWaypointCircuitを組み合わせると、上のGIFアニメのように、特定のコースを自動的に周回する挙動を作ることが出来ます。作り方は以下のとおりです。
- CarWaypointBasedプレハブをシーンへ配置する(以降、シーンに配置したCarWaypointBasedはCarWaypointBasedオブジェクトとする)
- 適当な空のオブジェクトを作成する。名前はWaypoint(暫定)とする
- Waypointオブジェクトの子として幾つかのオブジェクトし、走って欲しい位置に配置する
- WaypointオブジェクトにWaypointCircuitコンポーネントを追加する
- WaypointCircuitコンポーネントの「Assign using all child objects」をクリックし、子オブジェクトを元にしたルートを作成する。ルートを調整したければ、子オブジェクトの位置を調整する
- 最後にCarWaypointBasedオブジェクトのWaypointProgressTrackerのCircuitに先ほど作成したWaypointオブジェクトを登録する。
なお、このAIカーの挙動の性能はCarControllerへ依存します。例えば旋回速度を上げたければMaximum steer angleを上げると、旋回性能が上がりますし、加速性能が必要ならばFull Torque over all wheel、最高速度ならTopspeed等々。
またAI用のルートは動的に変更することが可能です*1。なので、AI毎に自分の走るべきコースを持っておき、特定条件により走るルートを変更する…といった事も良いアイディアかもしれません。
*1:カーソルが届く前ならば