Unityで車を動かす事に見出す楽しさのような何か
今回はUnity(ゆにてぃ)で車を動かしてみます。ゲームを作成したことがある方は「どうせ座標をずらしていくだけなんだろう」と思うかもしれませんが、違います。Unityではタイヤの滑りやすさや、車体の重さを考慮した物理演算によって車を動かすことが可能です。設定できる箇所が多いため、なかなか綺麗に走らせるにはコツが入りますがとりあえず動かしてみて色々調整するのも面白ので試してみてください。
Unityで車を動かしてみよう!その流れ~
- 地面の作成
車が走るためには地面が必要ですよね?まずは、地面を作成しましょう。3Dオブジェクトのplaneを利用して地面を作ります。 - 車を画面に配置します。
今回利用する車はアセットストアから無料でダウンロード可能です。
https://assetstore.unity.com/packages/3d/vehicles/land/m3a1-scout-car-53149実際に配置すると次のような形になります。かっこいい!
- rigidコンポーネントを設定して重さを定義する
車には重さがあるのでrigidコンポーネントを付け重さを1500にします。
- オブジェクトの形の定義と衝突判定のため、colliderをつける
- wheel colliderを追加
ここからいよいよ車を動かすためのポイントwheel colliderの設定です。unityにはタイヤ専用のcolliderとしてwheelcolliderがあります。このcolliderを各タイヤに割り当てて設定していきます。
タイヤのオブジェクトにwheelcolliderを割り当てると、タイヤを回転させる処理を記述するのが
ややこしくなるためcolliderは専用の空オブジェクトにまとめますね。 - wheelcolliderの設定
wheelcolliderの各パラメータを設定していきます。パラメータはサスペンション、ダンパー、バネの伸縮速度等色々なパラメータがあります。まずはRadiusとCenterを調整してタイヤとwheelcolliderが重なるように設定してください。
下記はunity公式リファレンスからの引用ですが、これ以外にもタイヤの摩擦カーブ等細かい説明が
ありますので参考にしてみてください。プロパティー 機能 Mass ホイールの質量。 Radius ホイールの半径。 Wheel Damping Rate ホイールに適用される減衰値です。 Suspension Distance ホイールサスペンションの最大延長距離で、ローカル空間で測定されます。サスペンションは常にローカルの Y 軸を通じて下に伸びます。 Force App Point Distance このパラメーターは、ホイールの力が適用される位置を定義します。これは、ホイールの基準となる静止位置からメートル単位でサスペンションの進行方向に沿った期待値を設定します。「forceAppPointDistance = 0」のとき、力はホイールの基準となる静止位置で適用されます。一般的に車両の重心より少し下で適用します。 Center オブジェクトのローカル空間でのホイールの中心。 Suspension Spring サスペンションが、スプリングと減衰力を追加して、Target Position に達しようとします。 Spring スプリング力が Target Position に到達しようとします。値が大きいほど、サスペンションが Target Position に到達する速度が上がります。 Damper サスペンションの速度を減衰します。値が小さいほど Suspension Spring の速度が下がります。 Target Position Suspension Distance に沿ったサスペンションの残りの距離。1 は、完全に伸びきったサスペンションをマッピングし、0 は完全に縮まったサスペンションをマッピングします。デフォルトは 0.5 で、通常の車両のサスペンションの動作に一致します。 Forward/Sideways Friction Forward/Sideways Friction ホイールが前転や横転する際のタイヤの摩擦のプロパティー。下記の Wheel Friction Curve を参照してください。 - スクリプトをアタッチする
プログラムで動かすための処理を書いていきます。
プログラムは次の通り
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273using System.Collections;using System.Collections.Generic;using UnityEngine;[System.Serializable]public class AxleInfo{public WheelCollider leftWheel;public WheelCollider rightWheel;public bool motor; //このホイールがエンジンにアタッチされているかどうかpublic bool steering; // このホイールがハンドルの角度を反映しているかどうか}public class carScript : MonoBehaviour{public List<AxleInfo> axleInfos; // 個々の車軸の情報public float maxMotorTorque; //ホイールに適用可能な最大トルクpublic float maxSteeringAngle; // 適用可能な最大ハンドル角度public WheelCollider wheelFL;public WheelCollider wheelFR;public WheelCollider wheelBL;public WheelCollider wheelBR;public Transform wheelFLTrans;public Transform wheelFRTrans;public Transform wheelBLTrans;public Transform wheelBRTrans;float steering = 0.0f;float motor = 0.0f;void Start(){}// Update is called once per framevoid Update(){//wheelcolliderの回転速度に合わせてタイヤモデルを回転させるwheelFLTrans.Rotate( wheelFL.rpm / 60 * 360 * Time.deltaTime, 0, 0);wheelFRTrans.Rotate( wheelFR.rpm / 60 * 360 * Time.deltaTime, 0, 0);wheelBLTrans.Rotate( wheelBL.rpm / 60 * 360 * Time.deltaTime, 0, 0);wheelBRTrans.Rotate( wheelBR.rpm / 60 * 360 * Time.deltaTime, 0, 0);//wheelcolliderの角度に合わせてタイヤモデルを回転する(フロントのみ)wheelFLTrans.localEulerAngles = new Vector3(wheelFLTrans.localEulerAngles.x, wheelFL.steerAngle - wheelFLTrans.localEulerAngles.z, wheelFLTrans.localEulerAngles.z);wheelFRTrans.localEulerAngles = new Vector3(wheelFRTrans.localEulerAngles.x, wheelFR.steerAngle - wheelFRTrans.localEulerAngles.z, wheelFRTrans.localEulerAngles.z);}public void FixedUpdate(){motor = -maxMotorTorque * Input.GetAxis("Vertical");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;}}}}プログラムのupdateでタイヤモデルの回転とステアリングの角度を変更しています。
一方、FixedUudateでは矢印、またはWASDのキー入力に対して変数motorとsteeringのwheelcoliderに与えてタイヤを回し、車を移動させています。 - プログラムを車に割り当て設定する。
作成したプログラムを車に割り当てると設定項目が表示されます。設定項目にタイヤのモデル、wheelcolliderを割り当てていきます。 - 動作確認
当スクールのYoutubeチャンネルからどうぞ!(笑)