このチュートリアルでは、PhysX Wheel Collider (ホイールコライダー) を使用して、正常に機能する基本的な 4 輪車を作成するプロセスについて説明します。
ステップは次のとおりです。
以下の手順に沿って操作するには、次の対象が必要です。
地面を作成するには、以下の操作を行います。
Ground に変更します。この平面は自動車が走る地面です。
まず、シーンに自動車のモデルを配置します。
Car アセットを選択します。Assets フォルダー (デフォルトの場所) に保存します。Hierarchy ウィンドウで Car ゲームオブジェクトの階層の外観を確認します。Car というルートゲームオブジェクトと、車体モデルと各ホイールモデルの子ゲームオブジェクトがあります。
衝突のために車体を設定します。
Car ルートゲームオブジェクトに、Rigidbody コンポーネントを追加します。Car Body ゲームオブジェクトで、Mesh Collider コンポーネントを追加します。
ホイールモデルにホイールコライダーを追加するには、ホイールモデルと同じ位置に 4 つの別々のゲームオブジェクトを新たに作成する必要があります (ただし、ホイールの子ゲームオブジェクトとして作成するわけではありません)。
これをほぼ同じ位置に設定する簡単な方法は、ホイールゲームオブジェクトを複製し、新しいゲームオブジェクトを設定することです。
Wheel Back Left (1))。わかりやすくするために、ゲームオブジェクト名に “コライダー” という語を追加します (例: Wheel Back Left collider)。Car ゲームオブジェクトの階層の外観は次のようになります。
次に、ホイールモデルに一致するようにホイールコライダーの位置とサイズを調整する必要があります。
ホイールコライダーを選択すると、シーンビューにホイールコライダー設定を可視化するギズモが表示されます (ホイールコライダーの可視化を参照)。ギズモを使用して、ホイールコライダーの位置とサイズをホイールモデルの位置とサイズと比較できます。
ホイールの向きとギズモをより明確に表示するには、シーンの描画モードをワイヤーフレームに、シーンの向きをアイソメトリックに設定します。
ホイールコライダーの追加で説明したワークフローで最初にホイールコライダーを追加すると、ホイールコライダーの高さが過剰に低く設定されます (シーンビューでは、ホイールモデルのメッシュの下にホイールコライダーの円が表示されます)。これは、Suspension Distance (サスペンション距離) がこれらのゲームオブジェクトの位置から始まり、Suspension Distance の設定で指定された距離だけ下方向に伸びるためです。シーンビューの可視化では、ホイールコライダーのギズモの Y 軸にオレンジ色の線で Suspension Distance が表示されます。
緑の円のアウトラインは、サスペンションの距離範囲の中間点でのホイールを示しています。自動車がサスペンションに押し込まれたり持ち上げられたりしていない場合は、ホイールの法線位置と考える必要があります。したがって、各ホイールコライダーの緑色のアウトラインは、対応するホイールメッシュの中央に配置する必要があります。
これを修正するには、WheelCollider ゲームオブジェクトをホイールコライダーのサスペンション距離の半分の値だけ上 (Y 軸上) に移動する必要があります。このプロジェクトの例では、サスペンション距離は 0.3 (デフォルト値) であるため、ホイールコライダーゲームオブジェクトを 0.15 単位上方に移動する必要があります。
Unity では、数値フィールドに簡単な数学的計算を入力できます。これを使用して、Y 軸の値に加算できます。
+0.15 を追加します (例えば、値が 0.5 の場合、値は 0.5+0.15 と表示されるようになります)。Unity は以前の値に +0.15 を適用し、これによりホイールコライダーゲームオブジェクトが Y 軸で 0.15 単位上方に移動します。
これで、ホイールコライダーのギズモは厳密にホイールメッシュの中央に配置されます。
ホイールコライダーの追加で説明したワークフローで最初にホイールコライダーを追加すると、ホイールコライダーのサイズが過剰に大きく設定されます (シーンビューでは、ホイールコライダーのギズモがホイールモデルのメッシュよりも大きくなっています)。
これを正確に修正するには、ホイールモデルの正確な半径を把握する必要があります。この情報は、3D モデリングソフトウェア、またはモデルを作成したテクニカルアーティストから入手する必要があります。
このサンプルプロジェクトでは、ホイールモデルの半径は 0.44 です。
0.44 に設定します。ホイールモデルの正確な半径の値が不明または入手できない場合は、ホイールコライダーのギズモを使用して、その半径をモデルにほぼ一致させることができます。または、スフィアコライダーを使用して半径を取得することもできます。これは、スフィアコライダーは、関連するモデルのメッシュに合わせて自動的にサイズ変更されるためです。
スフィアコライダーで半径を取得するには、次の手順を行います。
これでホイールコライダーは、位置とサイズがホイールモデルと正確に一致します。
自動車をコントロールするには、以下の処理を行うスクリプトをプロジェクトに追加する必要があります。
この例では、CarControl.cs と WheelControl.cs の 2 つのスクリプトを使用してこれを行います。
CarControl.cs という名前の C# ファイルを作成し、次のコードに貼り付けます。
using UnityEngine;
public class CarControl : MonoBehaviour
{
public float motorTorque = 2000;
public float brakeTorque = 2000;
public float maxSpeed = 20;
public float steeringRange = 30;
public float steeringRangeAtMaxSpeed = 10;
public float centreOfGravityOffset = -1f;
WheelControl[] wheels;
Rigidbody rigidBody;
// Start is called before the first frame update
void Start()
{
rigidBody = GetComponent<Rigidbody>();
// Adjust center of mass vertically, to help prevent the car from rolling
rigidBody.centerOfMass += Vector3.up * centreOfGravityOffset;
// Find all child GameObjects that have the WheelControl script attached
wheels = GetComponentsInChildren<WheelControl>();
}
// Update is called once per frame
void Update()
{
float vInput = Input.GetAxis("Vertical");
float hInput = Input.GetAxis("Horizontal");
// Calculate current speed in relation to the forward direction of the car
// (this returns a negative number when traveling backwards)
float forwardSpeed = Vector3.Dot(transform.forward, rigidBody.velocity);
// Calculate how close the car is to top speed
// as a number from zero to one
float speedFactor = Mathf.InverseLerp(0, maxSpeed, forwardSpeed);
// Use that to calculate how much torque is available
// (zero torque at top speed)
float currentMotorTorque = Mathf.Lerp(motorTorque, 0, speedFactor);
// …and to calculate how much to steer
// (the car steers more gently at top speed)
float currentSteerRange = Mathf.Lerp(steeringRange, steeringRangeAtMaxSpeed, speedFactor);
// Check whether the user input is in the same direction
// as the car's velocity
bool isAccelerating = Mathf.Sign(vInput) == Mathf.Sign(forwardSpeed);
foreach (var wheel in wheels)
{
// Apply steering to Wheel colliders that have "Steerable" enabled
if (wheel.steerable)
{
wheel.WheelCollider.steerAngle = hInput * currentSteerRange;
}
if (isAccelerating)
{
// Apply torque to Wheel colliders that have "Motorized" enabled
if (wheel.motorized)
{
wheel.WheelCollider.motorTorque = vInput * currentMotorTorque;
}
wheel.WheelCollider.brakeTorque = 0;
}
else
{
// If the user is trying to go in the opposite direction
// apply brakes to all wheels
wheel.WheelCollider.brakeTorque = Mathf.Abs(vInput) * brakeTorque;
wheel.WheelCollider.motorTorque = 0;
}
}
}
}
この CarControl.cs スクリプトを Car ルートゲームオブジェクトに追加します。
CarControl.cs スクリプトは、加速、トルク、ブレーキなどの自動車の動作をユーザー入力に基づいて処理します。詳細については、コードのコメント を参照してください。
CarControl.cs スクリプトの一部の要素は、次のセクションで作成された WheelControl.cs スクリプトを参照します。
WheelControl.cs という名前の C# ファイルを作成し、次のコードに貼り付けます。
using UnityEngine;
public class WheelControl : MonoBehaviour
{
public Transform wheelModel;
[HideInInspector] public WheelCollider WheelCollider;
// Create properties for the CarControl script
// (You should enable/disable these via the
// Editor Inspector window)
public bool steerable;
public bool motorized;
Vector3 position;
Quaternion rotation;
// Start is called before the first frame update
private void Start()
{
WheelCollider = GetComponent<WheelCollider>();
}
// Update is called once per frame
void Update()
{
// Get the Wheel collider's world pose values and
// use them to set the wheel model's position and rotation
WheelCollider.GetWorldPose(out position, out rotation);
wheelModel.transform.position = position;
wheelModel.transform.rotation = rotation;
}
}
このスクリプトを各ホイールコライダーゲームオブジェクトに追加します。
WheelControl.cs スクリプトは、WheelCollider.GetWorldPose を使用してシーン内のホイールコライダーの位置を取得します。スクリプトは、その位置情報を指定されたホイールモデルゲームオブジェクトに割り当てます。詳細については、コードのコメント を参照してください。
WheelControl.cs スクリプトの各インスタンスには、対応するホイール モデル ゲームオブジェクトへのリファレンスが必要です。
各ホイールコライダーに正しいホイールモデルゲームオブジェクトを割り当てるには、次の手順に従います。
CarControl スクリプトからモーター入力とステアリング入力を受け取るホイールを選択することも必要です。Wheel Control プロパティから四輪駆動自動車のシミュレーションを行うには、以下の手順を行います。
自動車をテストするには、再生モードに切り替え、矢印キーまたは WASD キーを使用して移動とステアリングを行います。入力コントロールは、ゲームビューにフォーカスがある場合にのみ機能します。
シーン内を動き回る自動車をより適切に表示するには、以下の手順を行います。
Carルートのゲームオブジェクトを選択し、シフト + F キーを押します。基本設定が完了したため、さまざまな設定を変更して自動車の動きにどのような影響を与えるかを確認できます。これらの手順を異なる車種で実行し、それらの設定の類似点と相違点を確認することもできます。