私は車の運転が苦手です。
だからせめてゲームの中では得意でいたい。
あわよくば峠を攻めたい...
そしてUnityでWheelColliderを使うことをふと思い立ちました。嘘です。
使ってみたらつまづいたことをメモ。
コライダーが見えない
まずはタイヤだけでテストしてみたいですね。
シーンに円柱を配置してWheelColliderをアタッチしてみましょう。
...あれ?
ん?
コライダー見えないよ?
Unityのマニュアルでは、円形の緑色の線が見えるはずです。
http://docs.unity3d.com/ja/current/Manual/class-WheelCollider.html
ほんとにコライダー付いてるんでしょうか。
解:Rigidbody を付ける
ホイールコライダーを持っているオブジェクト、もしくはその親オブジェクトのいずれかに対してRigidbodyをアタッチすれば、シーンにコライダーの緑線が表示されます。
WheelColliderはRigidbodyとセットで使うというのが前提なのでしょう
他のコライダーはRigidbodyなくても使えますけどね。
むっちゃはずむ
こんな感じのオブジェクト構造にしました。
Cubeがルートオブジェクトで、Rigidbodyがついています。WheelはWheelColliderがついている円柱オブジェクトです。
これでバッチリっしょ!再生!
...お、おう
飛んだね
解:重くする
WheelColliderのサスペンション(バネ)の跳ね返りが強すぎて飛んでしまうようです。
Rigidbodyのmassの値を増やして、車体を重くしましょう。
WheelColliderのSuspension関係の値をいじるのはやめたほうがいいでしょう。タイヤ4つ使うなら4つ分の値をいじる必要がありますし、言うても車ですから。重いですよね普通。
1000くらいにすればいいと思います。
まあ私車ぜんぜん詳しくないので、あとは友達の整備士にでも聞いてください。
タイヤ回転させてるのに動かない
コライダーはつけた。
車体は安定した。
あとはタイヤを回せば動くはず!
ということでスクリプトをアタッチしてみましょう。
Rigidbogy関係の処理だからFixedUpdateに書けばいいかな?
Meshの方向と合わせて、X軸にそって回転させればいいよね!
public class Wheel : MonoBehaviour { void Start () { } void FixedUpdate () { transform.Rotate ( Vector3.right, 100 * Time.fixedDeltaTime ); } }
再生GOGO!
...タンク?
解:WheelColliderのプロパティをいじる
WheelColliderのmotorTorqueプロパティを設定することで前進できます。
決してオブジェクト自体を回転させてはいけません。
using UnityEngine; using System.Collections; public class Wheel : MonoBehaviour { void Start () { GetComponent<WheelCollider> ().motorTorque = 50; } void FixedUpdate () { } }
マニュアルに書いてありました。
http://docs.unity3d.com/ja/current/ScriptReference/WheelCollider.html
ホイールは motorTorque、brakeTorque および steerAngle により制御できます。
結論
マニュアルはちゃんと読みましょう