車を走らせる(Wheel Collider)
Wheel Colliderの基本
車のゲームを作るには、基本的な車の機能を持つコライダー、Wheel Colliderの公式ドキュメントを確認しつつ進めます。
簡単なブロックの車を作る前に、地面を
GameObject > 3D Object > Terrain
で作成しておきます。
1. 公式ドキュメントより「基本的な車のスケルトンの作成」
ここは公式ドキュメント通りで問題なかったです。ただし、以下注意です。
特に注意なのが、車のBody部分を追加したばかりの時。一つ一つのパーツにColliderを入れないと、重力計算がおかしくなるらしく、飛び跳ねたりする。Mesh Colliderをよく使う。
メッシュコライダーについての注意(covexのところ)
https://docs.unity3d.com/ja/2018.4/Manual/class-MeshCollider.html
2. 「タイヤ」を使った、より具体的な見せ方
子供の頃作った「積み木の車」のようなもので、タイヤが回転し、前輪が左右に方向が変わるようにしたいと思います。
公式ドキュメントにはこうあります。
Wheel Collider はシミュレーションしたホイール位置と回転を Wheel Collider の Transform には適用しません。そのため、視覚的なホイールを追加するには、いくらか工夫が必要です。
最初に、タイヤのオブジェクトを追加します。その際に以下のような階層構造になるようにします
frontLeft | Wheel Coliderが追加されたオブジェクト。 |
---|---|
GameObject | 空のゲームオブジェクト |
Cylinder | 3Dオブジェクト > Cylinder |
次にコードを修正します。公式ドキュメント通りで大丈夫です。
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); } } }
そして最後、これがどこにも書いてなかったのですが、car_rootオブジェクトに付随するスクリプトのAxle Infosのパラメーターを繋ぎ直します。
Cylinderオブジェクトを追加し、スクリプトを変えた時点で、元々のパスが存在しないことになるので、当たり前なのですが、見落としました….
これで無事動くようになります!
足回りの調整
Riigidbodyの重心を変える
ジャンプしたジープが前のめりで落下する….重心を変えることで解決!
このCenter Of Mass のZ軸を0からわずかに下げることで、問題は解決した。
ちなみに、横転しやすさもY軸をわずかに下にすることで解決した!
サスペンションの可動域を広げた
サスペンションは、Sspension Distanceで広げた。ただし、Radius * 2 がタイヤの直径になるので、それを超えるとおかしくなるらしい。
あとForce App Point Distanceも少しだけ下げた。
ちなみに、カーブを曲がるときにスリップしやすかったのは、Forward FrictionとSideways Frictionのの設置値を変えることで良くなった! このパラメーターの理由が、なかなか難しい。
参考URL
- 3分で分かる、レースゲームの作り方!車の動きを物理演算で再現!オープンワールド Unity5 紹介
- Unity(ゆにてぃ)で車を動かしてみよう
- M3A1 Scout Car(Unity Assets Store)
- Wheel Collider チュートリアル(2021.2version)
- Stylized Vehicles Pack - FREE(Unity Assets Store)
- ビルトインの 3D 物理演算
- myCompiler(C#のテストコードが書ける)
- Microsoft公式 > Learn > .NET > C#関連のドキュメント
- C# の List
を使用したデータ コレクションの管理について説明します - List
クラス - [C#] デバッグログを出力する(Debug、Console)
- ギズモメニュー
- MonoBehaviour.FixedUpdate()
- Unity ユーザーマニュアル (2019.4 LTS) > 物理演算 > 3D 物理演算リファレンス > Wheel Collider
- WheelColliderを使って車を走らせよう!
- Rigidbodyの重心をずらす(質量に偏りを作る)方法【Unity】
- why is sideways tire slip separated from forward slip on wheel collider?
- UnityのWheel Colliderについて
- Unity : WheelColliderを初めて使うときにつまずくこと3つ
- Wheel Collider(公式マニュアル)