Version: Unity 6.0 (6000.0)
言語 : 日本語
Wheel collider のサスペンション
Wheel Collider コンポーネントのリファレンス

Wheel Collider を使用した自動車の作成

このチュートリアルでは、PhysX Wheel Collider (ホイールコライダー) を使用して、正常に機能する基本的な 4 輪車を作成するプロセスについて説明します。

ステップは次のとおりです。

  1. プロジェクトを準備する
  2. 自動車のモデルを準備する
  3. ホイールコライダーを追加し、位置と半径を設定する
  4. 自動車の動きやホイールの回転など、自動車の動作をコントロールするためのスクリプトを追加する
  5. 自動車をテストする

プロジェクトを準備する

以下の手順に沿って操作するには、次の対象が必要です。

  • 新しい空のシーン
  • 開いているプロジェクトにインポートされたデモ用の自動車のモデル (ダウンロード: car.fbx)
  • 自動車が横断する地面

地面を作成するには、以下の操作を行います。

  1. 平面ゲームオブジェクトを作成し、名前を Ground に変更します。この平面は自動車が走る地面です。
  2. 位置を (0,0,0)、スケールを (100,1,100) に設定します。

自動車のモデルを準備する

まず、シーンに自動車のモデルを配置します。

  1. Project ウィンドウで、インポートした Car アセットを選択します。
  2. Unity がシーンで表示できるように、自動車のモデルのテクスチャを抽出します。これを行うには、Inspector ウィンドウで Import Settings に移動し、以下の操作を行います。
    1. Materials を選択します。
    2. Textures > Extract Textures を選択します。開いたファイルエクスプローラーで、Assets フォルダー (デフォルトの場所) に保存します。
    3. Apply (適用) を選択します。
  3. Car アセットをシーンの地面または地面の真上に配置します。

Hierarchy ウィンドウで Car ゲームオブジェクトの階層の外観を確認します。Car というルートゲームオブジェクトと、車体モデルと各ホイールモデルの子ゲームオブジェクトがあります。

衝突のために車体を設定します。

  1. Car ルートゲームオブジェクトに、Rigidbody コンポーネントを追加します。
  2. Rigidbody の Mass を `1500` に設定します。この値は、キログラム単位で自動車のウェイトを定義します。これは、ホイールコライダーのデフォルトのサスペンション設定に適したウェイトです。詳細については、ホイールコライダーのサスペンション: 質量とサスペンションの値を参照してください。
  3. Car Body ゲームオブジェクトで、Mesh Collider コンポーネントを追加します。
  4. 新しい Mesh Collider コンポーネントで、Convex を有効にします。

ホイールコライダーを追加する

ホイールモデルにホイールコライダーを追加するには、ホイールモデルと同じ位置に 4 つの別々のゲームオブジェクトを新たに作成する必要があります (ただし、ホイールの子ゲームオブジェクトとして作成するわけではありません)。

これをほぼ同じ位置に設定する簡単な方法は、ホイールゲームオブジェクトを複製し、新しいゲームオブジェクトを設定することです。

  1. 4 つのホイールゲームオブジェクトをすべて選択します。
  2. ゲームオブジェクトを複製します (Ctrl/Cmd+D)。
  3. 4 つの複製すべてを選択し、以下の操作を行います。
    1. Mesh Renderer と Mesh Filter コンポーネントの削除
    2. Wheel Collider コンポーネントの追加
  4. 新しいホイールコライダーゲームオブジェクトの名前を変更します。デフォルトでは、Unity は複製ゲームオブジェクトに同じ名前を付け、括弧で囲んだ番号を追加します (例: Wheel Back Left (1))。わかりやすくするために、ゲームオブジェクト名に “コライダー” という語を追加します (例: Wheel Back Left collider)。

Car ゲームオブジェクトの階層の外観は次のようになります。

ルートの Car ゲームオブジェクトとすべての子ゲームオブジェクト。子ゲームオブジェクトには、Car Body (車体)、4 つのホイールモデルのゲームオブジェクト、4 つのホイールコライダーゲームオブジェクトが含まれます。
ルートの Car ゲームオブジェクトとすべての子ゲームオブジェクト。子ゲームオブジェクトには、Car Body (車体)、4 つのホイールモデルのゲームオブジェクト、4 つのホイールコライダーゲームオブジェクトが含まれます。

次に、ホイールモデルに一致するようにホイールコライダーの位置とサイズを調整する必要があります。

ホイールコライダーを選択すると、シーンビューにホイールコライダー設定を可視化するギズモが表示されます (ホイールコライダーの可視化を参照)。ギズモを使用して、ホイールコライダーの位置とサイズをホイールモデルの位置とサイズと比較できます。

ホイールの向きとギズモをより明確に表示するには、シーンの描画モードワイヤーフレームに、シーンの向きアイソメトリックに設定します。

ホイールコライダーの位置の設定

ホイールコライダーの追加で説明したワークフローで最初にホイールコライダーを追加すると、ホイールコライダーの高さが過剰に低く設定されます (シーンビューでは、ホイールモデルのメッシュの下にホイールコライダーの円が表示されます)。これは、Suspension Distance (サスペンション距離) がこれらのゲームオブジェクトの位置から始まり、Suspension Distance の設定で指定された距離だけ下方向に伸びるためです。シーンビューの可視化では、ホイールコライダーのギズモの Y 軸にオレンジ色の線で Suspension Distance が表示されます。

緑の円のアウトラインは、サスペンションの距離範囲の中間点でのホイールを示しています。自動車がサスペンションに押し込まれたり持ち上げられたりしていない場合は、ホイールの法線位置と考える必要があります。したがって、各ホイールコライダーの緑色のアウトラインは、対応するホイールメッシュの中央に配置する必要があります。

ホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーが過剰に大きく、高さが低すぎます。
ホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーが過剰に大きく、高さが低すぎます。

これを修正するには、WheelCollider ゲームオブジェクトをホイールコライダーのサスペンション距離の半分の値だけ上 (Y 軸上) に移動する必要があります。このプロジェクトの例では、サスペンション距離は 0.3 (デフォルト値) であるため、ホイールコライダーゲームオブジェクトを 0.15 単位上方に移動する必要があります。

Unity では、数値フィールドに簡単な数学的計算を入力できます。これを使用して、Y 軸の値に加算できます。

  1. 4 つのホイールコライダーゲームオブジェクトすべてを選択します。
  2. Inspector で、Transform の Position プロパティに移動します。
  3. Y 軸の値で、カーソルを値の末尾に置きます。値の末尾に +0.15 を追加します (例えば、値が 0.5 の場合、値は 0.5+0.15 と表示されるようになります)。
  4. Return キーを押します。

Unity は以前の値に +0.15 を適用し、これによりホイールコライダーゲームオブジェクトが Y 軸で 0.15 単位上方に移動します。

これで、ホイールコライダーのギズモは厳密にホイールメッシュの中央に配置されます。

ホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーはホイールモデルの中央に正しく配置されています。
ホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーはホイールモデルの中央に正しく配置されています。

ホイールコライダーの半径の設定

ホイールコライダーの追加で説明したワークフローで最初にホイールコライダーを追加すると、ホイールコライダーのサイズが過剰に大きく設定されます (シーンビューでは、ホイールコライダーのギズモがホイールモデルのメッシュよりも大きくなっています)。

これを正確に修正するには、ホイールモデルの正確な半径を把握する必要があります。この情報は、3D モデリングソフトウェア、またはモデルを作成したテクニカルアーティストから入手する必要があります。

このサンプルプロジェクトでは、ホイールモデルの半径は 0.44 です。

  1. ホイールコライダーゲームオブジェクトを 4 つすべて選択する
  2. Inspector で、Wheel collider コンポーネントの Radius プロパティに移動する
  3. Radius0.44 に設定します。

ホイールモデルの正確な半径の値が不明または入手できない場合は、ホイールコライダーのギズモを使用して、その半径をモデルにほぼ一致させることができます。または、スフィアコライダーを使用して半径を取得することもできます。これは、スフィアコライダーは、関連するモデルのメッシュに合わせて自動的にサイズ変更されるためです。

スフィアコライダーで半径を取得するには、次の手順を行います。

  1. ホイールモデルゲームオブジェクトを選択します。
  2. スフィアコライダーを追加します。
  3. スフィアコライダーの Radius プロパティ値をメモします。
  4. スフィアコライダーを削除します。
  5. 4 つのホイールコライダーゲームオブジェクトすべてを選択します。
  6. Inspector で、Wheel collider コンポーネントの Radius プロパティに移動します。
  7. ホイールコライダーの Radius を、メモしたスフィアコライダーの Radius 値に設定します。

これでホイールコライダーは、位置とサイズがホイールモデルと正確に一致します。

2 つのホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーはホイールモデルの中心に正しく配置され、それらの半径はホイールモデルの半径と正しく一致しています。
2 つのホイールコライダーのギズモは、ホイールモデルに対するホイールコライダーの位置を示します。この画像では、ホイールコライダーはホイールモデルの中心に正しく配置され、それらの半径はホイールモデルの半径と正しく一致しています。

自動車の動作をコントロールするためのスクリプトの追加

自動車をコントロールするには、以下の処理を行うスクリプトをプロジェクトに追加する必要があります。

  • 自動車の動きのコントロール:ユーザー入力に基づいて、ステアリング、トルク、およびブレーキの値をホイールコライダーに送信します。
  • コントロールホイールの動き:各ホイールコライダーの状態に応じてホイールメッシュを移動および回転します。

この例では、CarControl.csWheelControl.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 スクリプトの各インスタンスには、対応するホイール モデル ゲームオブジェクトへのリファレンスが必要です。

各ホイールコライダーに正しいホイールモデルゲームオブジェクトを割り当てるには、次の手順に従います。

  1. ホイールコライダーゲームオブジェクトの選択
  2. Inspector ウィンドウで、スクリプトによって作成されたホイールコントロールコンポーネントを操作します。
  3. 対応するホイール モデル ゲームオブジェクトにホイール モデルを設定します (例えば、“Wheel Rear Left コライダー” ゲームオブジェクトで、“Wheel Rear Left” ホイール モデル ゲームオブジェクトを割り当てます)。
  4. ホイールコライダーごとに繰り返します。

CarControl スクリプトからモーター入力とステアリング入力を受け取るホイールを選択することも必要です。Wheel Control プロパティから四輪駆動自動車のシミュレーションを行うには、以下の手順を行います。

  1. 4 つのホイールコライダーゲームオブジェクトすべてで、Motorized を有効にします。
  2. 2 つの正面ホイールコライダーゲームオブジェクトで、Steerable を有効にします。

自動車をテストする

自動車をテストするには、再生モードに切り替え、矢印キーまたは WASD キーを使用して移動とステアリングを行います。入力コントロールは、ゲームビューにフォーカスがある場合にのみ機能します。

シーン内を動き回る自動車をより適切に表示するには、以下の手順を行います。

  1. シーンビューとゲームビューの両方が同時に表示されるように Editor Windows を配置します。
  2. シーンビューのフォーカスを自動車にロックします。これを行うには、シーンビューでCarルートのゲームオブジェクトを選択し、シフト + F キーを押します。

基本設定が完了したため、さまざまな設定を変更して自動車の動きにどのような影響を与えるかを確認できます。これらの手順を異なる車種で実行し、それらの設定の類似点と相違点を確認することもできます。

Wheel collider のサスペンション
Wheel Collider コンポーネントのリファレンス