読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unity5で車の挙動をパパっと追加して乗り回す。ついでにAI Carも。

Unity 3D StandardAssets アセット紹介、AssetStore ゲームの作り方・チュートリアル・サンプル

今回はUnityがSampleAssetsで提供している車の挙動について紹介します。

f:id:tsubaki_t1:20150405000423p:plain

なおこの挙動はUnityの物理演算(主にWheel Collider)に従った挙動のため、マリオカートF-ZEROのような、全体的に物理的ではない挙動を表現したい場合は、これを改造して作るより0から自分で挙動を書いたほうが良いかもしれません。

またレーシングゲームで使いたい場合、転覆したら戻す・もしくは絶対転覆しないように一定角度以上傾いたら強制的に戻すといった仕組みがひつようになるかもしれません。

目次

とりあえず車を走らせる

まずはStandardAssetsのVehiclesより、Carコンポーネントを含むコンポーネントを入手します。メニューバーのAssets>Import Package>Vehiclesでインポートできます。

もしImport Packageの中身がCustom Packageのみの場合、Standard Assetsがインストールされていません。その場合はインストーラーのStandard Assetsをインストールします。

f:id:tsubaki_t1:20150405000803p:plain

f:id:tsubaki_t1:20150405001214p:plain

パッケージをインポートすると、ProjectビューのStandardAssets>Vehiclesが追加されるので、StandardAssets>Vehicles>Car>PrefabsよりCarプレハブをドラッグ&ドロップしてシーンに登録します(以降、シーンにあるCarプレハブはCarオブジェクトとします)。

f:id:tsubaki_t1:20150405001631p:plain

これで車が登録出来ました。後は適当にステージとか作って走らせれば、ゲーム内を車が走ります。

Sample Assetsのプロトタイプアセットを並べて簡単なステージを作ってみよう[Unity] - テラシュールブログ

f:id:tsubaki_t1:20150405003253p:plain

f:id:tsubaki_t1:20150405003120g:plain

ちなみに操作は、WSで前進後退、ADでハンドルです。スペースでブレーキ。

車をオリジナルカーにする

車を自分のオリジナルの車に変更します。今回はUnityの提供するShanty Town: SUVを使用します。なので、AssetStoreからダウンロードしておきます。

f:id:tsubaki_t1:20150405003519p:plain

まずは先ほどシーンへ配置したCarオブジェクトSkyCarオブジェクトを削除します。LosingPrefabとか言ってきますが、無視してContinueです。

f:id:tsubaki_t1:20150405003716p:plain

f:id:tsubaki_t1:20150405003854p:plain

次に先ほどインポートしたVEHICLE_SUVをSkyCarの代わりにCarオブジェクト以下に配置します。その際、VEHICLE_SUVのTransformのPosition(x:0, y:0, z:0)に設定します。

f:id:tsubaki_t1:20150405004307g:plain

f:id:tsubaki_t1:20150405004332p:plain

また車の車輪を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コンポーネントを追加して登録します。

f:id:tsubaki_t1:20150405011902p:plain

車のホィールの位置を調整します。

CarプレハブのWheelsHubs以下のWheelHubFrontRightWheelHubRearRightWheelHubFrontLeftWheelHubRearLeftをそれぞれ車のホィールの位置へ調整します。基本的な座標はとりあえずはTransformで調整して、ホィールの大きさはWheelColliderRadius(半径)で調整します。

f:id:tsubaki_t1:20150405005232p:plain

f:id:tsubaki_t1:20150405004910g:plain

次にコライダーの大きさを調整します。このCarプレハブは所謂複合コライダーを使用しています。車の大きさに合うようにコライダーの位置や大きさを調整します。

コライダーはCarオブジェクト>Colliders以下のオブジェクトが管理しています。この中のコライダーを調整してもよいですし、新しく作っても良いです。計上に一致するように、コライダーの位置・サイズを調整します。

調整するには、「単純にTransformの位置・サイズ・大きさ」を調整するか、Colliderコンポーネントの「Edit Collider」をクリック後に緑の点をドラッグして調整します。

f:id:tsubaki_t1:20150405010231p:plain

【Unity】Unity 4.6 変更点「Edit Collider」 - コガネブログ

f:id:tsubaki_t1:20150405005757p:plain

最後にハンドルを回した際にタイヤが傾くようにします。

傾きを行ってくれるコンポーネントMudguardです。これはCarの状態を確認し、傾きが発生していればタイヤを傾ける演出を行います。(つまり、傾いたから曲がるのではなく、曲がったから傾く感じです)

今回の場合 SUV_wheel_front_leftSUV_wheel_front_rightの2つのタイヤが傾くと良い感じなので、この2つにMudguardを追加します。

SUV_wheel_front_leftSUV_wheel_front_rightの両方を選択して、Add ComponentでMudguardを追加します。

最後に、MudguardのCarControllerにCarオブジェクトを登録します。

f:id:tsubaki_t1:20150405011229p:plain

これでモデルの差替えは完了です。

f:id:tsubaki_t1:20150405012451g:plain

AI Carによるルートの巡回について

Carフォルダ以下には、CarプレハブだけでなくCarWaypointBasedなるプレハブが存在します。これが何かと言えば、単純に言えば自動操縦が可能なCarです。

f:id:tsubaki_t1:20150405020752p:plain

f:id:tsubaki_t1:20150405013836g:plain

この機能はUtilityパッケージの中のWayPoint機能を使用します。このパッケージをインポートすると、Vehiclesパッケージで不足しているコンポーネントが補完され、CarWaypointBasedが完全なプレハブとなります。

Unityのunitypackage出力について - テラシュールブログ

f:id:tsubaki_t1:20150405014127p:plain

CarWaypointBasedとWaypointCircuitを組み合わせると、上のGIFアニメのように、特定のコースを自動的に周回する挙動を作ることが出来ます。作り方は以下のとおりです。

  1. CarWaypointBasedプレハブをシーンへ配置する(以降、シーンに配置したCarWaypointBasedはCarWaypointBasedオブジェクトとする)
  2. 適当な空のオブジェクトを作成する。名前はWaypoint(暫定)とする
  3. Waypointオブジェクトの子として幾つかのオブジェクトし、走って欲しい位置に配置する
  4. WaypointオブジェクトにWaypointCircuitコンポーネントを追加する
  5. WaypointCircuitコンポーネントの「Assign using all child objects」をクリックし、子オブジェクトを元にしたルートを作成する。ルートを調整したければ、子オブジェクトの位置を調整する
  6. 最後にCarWaypointBasedオブジェクトのWaypointProgressTrackerのCircuitに先ほど作成したWaypointオブジェクトを登録する。

f:id:tsubaki_t1:20150405015014p:plain

f:id:tsubaki_t1:20150405015027p:plain

f:id:tsubaki_t1:20150405014943p:plain

なお、このAIカーの挙動の性能はCarControllerへ依存します。例えば旋回速度を上げたければMaximum steer angleを上げると、旋回性能が上がりますし、加速性能が必要ならばFull Torque over all wheel、最高速度ならTopspeed等々。

またAI用のルートは動的に変更することが可能です*1。なので、AI毎に自分の走るべきコースを持っておき、特定条件により走るルートを変更する…といった事も良いアイディアかもしれません。

*1:カーソルが届く前ならば