Wheel Collider コンポーネントは PhysX3 Vehicles SDK によって強化されています。
このチュートリアルでは、基本的な機能をもつ車を作成してみましょう。
まず初めに GameObject > 3D Object > Plane の順に選択してください。これは車が走る地面です。わかりやすくするために、地面の Transform を 0 にします (インスペクターウィンドウの Transform コンポーネントで、設定の歯車アイコンをクリックし Reset を選択)。Transform の Scale を 100 にして地面を拡大します。
car_root
に変更します。car_root
に加えます。デフォルトで設定されている Mass (質量) 1kg では、デフォルトのサスペンション設定には軽すぎるので、1500kg に変更してずっと重くします。car_root
の子のゲームオブジェクトにします。ローカル座標空間で完全に整列させるために、トランスフォームを 0 にリセットします。車は Z 軸に合わせて配置されているので、Transform の Scale の Z を 3 に設定します。car_root
を選択しておき GameObject > Create Empty Child を選択します。名前を wheels
に変更します。Transform をリセットしてください。このゲームオブジェクトは強制ではありませんが、後で調節やデバッグを行うのに便利です。wheels
ゲームオブジェクトを選択しておいて GameObject > Create Empty Child の順に選び、名前を frontLeft
にします。Transform の Position を X を –1、Y を 0、Z を 1 に設定します。ホイールにコライダーを設定するには Add component > Physics > Wheel Collider の順に選択します。frontLeft
ゲームオブジェクトを複製します。 Transform の Position の X を 1 に変更し、名前を frontRight
に変更します。frontLeft
と frontRight
オブジェクトの両方を選択します。それらを複製し、両方の Transform の Position の Z を −1 に変更します。それぞれ名前を rearLeft
と rearRight
に変更します。car_root
ゲームオブジェクトを選択し、移動ツールを使用して、それを地面の少し上に上げます。これで、下の図ように見えるはずです。
この車を実際に動かすにはコントローラーを作成する必要があります。下のコードサンプルはコントローラーとして使えます。
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; // このホイールがハンドルの角度を反映しているかどうか
}
car_root
ゲームオブジェクト上で新しい C# スクリプトを作成し (Add Component > New Script)、このコード例をスクリプトにコピーし、 SimpleCarController.cs で保存します。スクリプトのパラメーターを以下のように微調整できます。設定をテストするには再生モードで試してみます。
以下の設定は車のコントローラーとしてとても効果的です。
ヒント: 必ず AxleInfos
の size
を増やしてください。
1 台の車に最大 20 のホイールを設定することができ、それぞれにハンドル、エンジン、ブレーキのトルクを適用できます。
今度は、視覚的なホイールに移ります。ご覧のとおり、Wheel Collider はシミュレーションしたホイール位置と回転を Wheel Collider の Transform には適用しません。そのため、視覚的なホイールを追加するには、いくらか工夫が必要です。
まず、いくつかホイールジオメトリを作らなくてはなりません。シリンダーから簡単なホイール形状を作れます。視覚的なホイールを追加するにはいくつか方法があります。スクリプトプロパティーで、手動で視覚的なホイールを割り当てるか、または、いくつかのロジックを書いて、自動的に対応する視覚的なホイールを検索します。私たちは、2 番目の方法を使用します。Wheel Collider ゲームオブジェクトに、視覚的なホイールを付加します。
コントローラースクリプトを変更します。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class AxleInfo {
public WheelCollider leftWheel;
public WheelCollider rightWheel;
public bool motor;
public bool steering;
}
public class SimpleCarController : MonoBehaviour {
public List<AxleInfo> axleInfos;
public float maxMotorTorque;
public float maxSteeringAngle;
// 対応する視覚的なホイールを見つけます
// Transform を正しく適用します
public void ApplyLocalPositionToVisuals(WheelCollider collider)
{
if (collider.transform.childCount == 0) {
return;
}
Transform visualWheel = collider.transform.GetChild(0);
Vector3 position;
Quaternion rotation;
collider.GetWorldPose(out position, out rotation);
visualWheel.transform.position = position;
visualWheel.transform.rotation = rotation;
}
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;
}
ApplyLocalPositionToVisuals(axleInfo.leftWheel);
ApplyLocalPositionToVisuals(axleInfo.rightWheel);
}
}
}
Wheel Collider コンポーネントのうち大切なパラメーターの 1 つは Force App Point Distance です。これは、ホイールの基準となる静止位置からホイールの力が適用される位置までの距離を示します。デフォルト値は 0 、つまり、ホイールの基準となる静止位置に力を適用します。しかし、実際は車の重心より少し下にこの位置を置くとよいでしょう。
ノート: 実際の Wheel Collider の動きを見るには、Vehicle Tools をダウンロードします。このパッケージには、ホイール付きの車を装備し wheel collider のサスペンションを作成するツールが含まれています。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.