Blenderで作った車をUnityで動かす②車を動かす!!

どうでもいいからBlenderで作った車をUnityで車を動かすやり方だけを教えろ。同意見だ。さっそくはじめよう。

Blenderで作った車をUnityで動かす。2つ目のステップ

前回はBlenderで作ったオブジェクトをUnityに読み込むところまでをやった。ここまでできていることが前提だ。

Unityで車を動かすための手順

実はBlenderのオブジェクトをUnityで読み込んだら、もうBlenderは触る必要はない。ここから話すのはUnityの話だ。

  • Unityで空のゲームオブジェクトを作成し名前はcar_rootにする
  • car_rootの子要素にもうひとつ空のゲームオブジェクトを作成。名前はwheelsこの中に空のゲームオブジェクトを4つ作成し、WheelColiderを追加する。
  • SimpleCarControllerスクリプトを作成
  • car_rootにrigitbodyコンポーネントの追加。CarControllerスクリプトのアタッチ
  • 床にMeshCollider、車体にBoxColliderを追加
  • CarControllerスクリプトにタイヤをアタッチしていく

やることが多いがひとつひとつやっていこう。

Unity上のオブジェクトを整理しよう

Blenderの車オブジェクトはパーツが多すぎた。車のパーツは空のゲームオブジェクトcar_root、その中にwheelsを作成するといったはずだ。まずは名前つけとフォルダわけからだ。
screenshot 20181225 2049
最低でもcar_rootとwheelsは作成しておく。あとの車のパーツ名はぶっちゃけなんでもよい。車に関係ない床やランプなどはcar_rootの外に出しておく。

CarControllerスクリプトを作成する

スクリプトと聞いてやる気をなくしてしまったかもしれない。だが心配いらないスクリプトはコピペだ。空のスクリプトすら作れないならdotinstallをまずやるのがよいだろう。CarControllerScriptのソースはUnityの公式が提供している。ここだ。↓
Wheel Collider チュートリアル – Unity マニュアル

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にアタッチすると様々なパラメーターを設定できるようになる。

オブジェクトにコンポーネントを追加していく

スクリプトが完成したら必要なコンポーネントを追加しパラメーターを設定していく。

  • car_rootにSimpleCarControllerスクリプトをアタッチ。RigidBodyを追加しmassを1500に
  • 床にMeshColliderを追加する
  • carのrearbodyにBoxColliderを追加する
  • Wheelsの子オブジェクトにWheelColliderを追加する
  • car_rootのスクリプトにパラメータを設定しWheelsの子要素をアタッチしていく

Colliderは車と床両方に設定しなければならない。理由はこれがないと車が床から抜け落ちてしまうためだ。車にRigidBodyを追加する理由は車両重量を設定するためだ。RigidBodyがなければ車は空中に消えてしまう。WheelColliderは車を操縦するために必要だ。アタッチやパラメーターの設定は画像にすると説明が長くなるので、最後の動画をみたほうがよい。

Unityを再生して車を走らせてみよう

Unityをデバッグして車を走らせてみよう。方向キーを使えば車を走らせることができる。

Unityで実装した車の操作方法
↑キー 前進
↓キー 後進
→キー 左に旋回
→キー 右に旋回

screenshot-20181225-2106

Blednerで読みこんだ車をUnityで走らせるまでの過程を動画でみる

アタッチやパラメーターの設定が画像や文字だとわかりにくいので動画にします。動画ではオブジェクトの名前わけをBlenderで行っている状態で撮っています。

次の記事

この作業を終えた状態だと、車をカメラが追尾するような機能がありません。次の記事ではそのあたりを追及したいと思います。
Blenderで作った車をUnityで動かす③カメラを追尾させる。