はじめに
主にレースゲームで使われる車ですが、Unityでは車を動かせるようにホイールコライダーと呼ばれる仕組みが提供されています。これを使って車を実際に動かす方法について解説します。
本記事で学べること
- 車を運転して動かす方法
- カメラの追従方法

ではさっそく始めていきましょう!
使用する車モデルアセット
今回は、以下の車の無料3Dモデルを使って動かしてみたいと思います。
カラーバリエーションも豊富な車のアセットです。

車と地面のモデルをシーンに配置
車のモデルをシーンに配置します。
インポートしたアセットのPrefabsフォルダーが2種類ありますが、Prefabs(Meshes Only)内の車を使います。

好きな色の車をシーンビュー、またはヒエラルキーにドラッグ&ドロップします。

次に、地面を配置します。
同じアセットのMeshesフォルダー内のRoadをヒエラルキーにドラッグ&ドロップします。

地面の設定
Roadには、初めはマテリアルがついていませんが、Materialsフォルダー内のAFRC_Env_Matを、Roadにドラッグ&ドロップして設定すると、色がつきます。

地面には、Box Colliderコンポーネントを追加しておきます。

タイヤにホイールコライダーをつけよう
タイヤを動かすための準備をします。
コライダーを取り付けるオブジェクトの作成
車の子オブジェクトにからのオブジェクト(Wheel Colliderと名付けました)を追加し、その中にさらに4つのオブジェクトを追加します。
4つは各タイヤ用のコライダーになるので、わかりやすくRearLeftなど、タイヤ位置がわかる名前が良いです。

それぞれタイヤの位置に配置します。Meshes内にあるタイヤのモデルの位置をコピーしましょう。

ホイールコライダーコンポーネントを追加
先ほど作成した4つのオブジェクトにホイールコライダー(Wheel Collider)とRigidbodyコンポーネントを追加します。Rigidbodyは本来いらないのですが、これをつけていないとホイールコライダーの緑の円が見えなくなってしまうので、一時的に追加しています。

シーンビューに緑の円が表示されるので、ホイールコライダーのRadius(半径)やCenterを調整してタイヤのサイズと位置に合わせましょう。



調整が終わったら、タイヤに追加したRigidbodyは全て削除しておこう!
車本体の設定
車の一番親のオブジェクト(Free Racing Car Blue Variant)には、以下の3点を追加します。
車の親オブジェクトに追加するもの
- Box Collider
- Rigidbody
- 車を動かすスクリプト

1. Box Colliderの追加
コライダーは車の衝突判定になりますので、車を覆うようにサイズや位置を調整します。

2. Rigidbodyの追加
RigidbodyのMass(重さ)はデフォルトでは1kgとなっていますが、軽すぎるので1500に設定します。

3. スクリプトの追加
スクリプトを作成します。コードは以下を参考にしました。これも追加します。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SimpleCarController : MonoBehaviour {
public List<AxleInfo> axleInfos; // 個々の車軸の情報
public float maxMotorTorque; //ホイールに適用可能な最大トルク
public float maxSteeringAngle; // 適用可能な最大ハンドル角度
public void FixedUpdate()
{
float motor = maxMotorTorque * Input.GetAxis("Vertical");
float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
foreach (AxleInfo axleInfo in axleInfos) {
if (axleInfo.steering) {
axleInfo.leftWheel.steerAngle = steering;
axleInfo.rightWheel.steerAngle = steering;
}
if (axleInfo.motor) {
axleInfo.leftWheel.motorTorque = motor;
axleInfo.rightWheel.motorTorque = motor;
}
}
}
}
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor; //このホイールがエンジンにアタッチされているかどうか
public bool steering; // このホイールがハンドルの角度を反映しているかどうか
}
スクリプトを追加したら、インスペクターは以下のように設定します。

これで車を動かせる準備は完了です!
車を走らせてみる
ゲームを開始して、十字キーで車を動かすことができます。バックもできました。
車に追従するカメラを作ろう
車の後ろからカメラを撮るには、Main Cameraを車の子オブジェクトにして、カメラの位置を調整します。

先ほどは、地面が狭すぎたので、TransformのScaleを上げて大きくしました。

無事カメラを追従させることができました!ただ、曲がりすぎると倒れてしまうので、車の両サイドにホイールコライダーをさらに追加すれば倒れないようにできそうです。
おわりに
ホイールコライダーを使って車を走らせる方法について紹介しました。
簡易的なものでしたが、さらにリアルに車を動かしたい方はこちらのアセットもおすすめです。
