Unityで車を動かす!どうすればいいのか?初心者様向けの記事

Unityで車を動かすって調べると、
自分からすると、
意味不明だったので、
ポンコツ素人目線でお伝えできたらなと思います。
というより、
自分の復習用にメモとして残します。
一回やっただけだと、
激しく忘れる上に、
動画だと、どこで何をやってるのかがわからないので、
結局、最初から最初まで見なきゃいけないのもあったので、
文字で残すと案外わかりやすいので、
文字の力を使います。

 

正確な言葉や理解ではないので、

その辺は悪しからず。

 

繰り返しですが、

まともに書けば書くほど、

理解し難いものになると思うので、勘違いも多いにあると思って呼んでください。

 

 

この動画を真似て見たいと思います。

 

Unityでの内容

 

車を動かすといっても、

モーターとかエンジンとかそういったものはいりません。

タイヤとボディがあれば、できます。

1・ブレンダーでボディとタイヤを作成

2・ボディとタイヤの設定

3・ブログラムで制御

 

大まかないいうとこんな内容になっています。

 

Unityでの初期設定

3分ぐらいまで、

 

carっていうゲームオブジェクトを作り、

その中に、

ボックスコライダー(重力設定)、ホイールコライダー(タイヤの回転)、メッシュ(モデルを入れる)

車の作り方 22分まで

車は、ブレンダーなので、

正直、説明は別で書くべき時が、きたら書きます。

Unityでの操作

 

22分から〜

 

マテリアルで色をつける

25分まで

 

ボディとタイヤに色をつける方法を解説しています。

 

ボディとタイヤの設定

carに重力設定 26分頃

全体のcarに重力設定をします。

carを選択し、インスペクターの中の

コンポーネントを追加→phisics→リジットボディ

重量を設定する。

 

ボディにボックスコライダー

車のボディにボックスコライダーの設定をする。27分30秒まで

 

ボックスコライダーって何?

Box Collider コンポーネントのリファレンス - Unity マニュアル
Box Collider (ボックスコライダー) は基本的な直方体型の衝突プリミティブです。

ここに書いてあります。

 

つまり、ボディに重力の設定をするということですね。

車を動かした時に、重力の設定をしてないと、ボディが浮いたままの挙動になります。

 

見ていただくと、わかりますが、大まかな設定になってますね。

つまり、それでも大丈夫ということです。

 

タイヤに回転設定 27分〜

※メインのcarの重力設定をしなかった為に、(実態がないから?)

ホイールコライダーを設定することができませんでした。

 

wheelcolliderとは、タイヤの特にホイールを回転させる為みたいです。

Wheel Collider - Unity マニュアル
Wheel Collider は、陸上車両用の特殊なコライダーです。組み込み衝突検出、ホイール物理特性、スリップベースのタイヤ摩擦モデルを含みます。ホイール以外のオブジェクトにも使用できますが、特にホイールのある車両向けに設計されています。

ここに詳しく書いてあります。

 

で、ここでwheelcolliderの設定をしています。

 

4つ、wheelcolliderの設定をしています。

 

ボディの回転中心を

29分あたりから

 

ピボットする時に、中心が変ないつだと、

回転して時に、へんなふうになるから、

回転の中心を設定していた方が良い。¥

 

車が走るフィールドの作成 34分〜

フィールドを設定

フィールドを設定すると、車が埋まってしまっています。

そこで、また、ボディの中心設定をブレンダーでしています。36分〜

 

床の柄を作る 40分〜

ギンプを使っているので、

スルーします。

 

車の制御 43分〜

タイヤの設定ですね。

空中から地面に着地した時の挙動を調整しています。

質量、スプリング、ダンパー(減衰)

物理的に難しいので、スルーします。

 

 

プログラム 50分〜

carのインスペクターに

C#をドロップします。

その後、プログラム

public Transform[] wheelcolliders = new Transform[4];

を記入。

 

これは、つまり、インスペクターにホイールコライダーの要素を表示する。

ということですね。

で、結果、

 

要素を4つ、入力できるようになります。

で、入力した結果がこれです。

 

public Transform[] tiresmeshes = new Transform[4];

public WheelCollider[] wheelcolliders = new WheelCollider[4];

 

void Update()

{

UpdateMeshesPosition ();

}

 

 

Private(動画にはないが、これがないと動かなかった) void updateMeshesPosition()
    {

for (int i = 0; i< 4; i++)
        {

Quaternion quat;
    Vector3 pos;
    wheelcolliders[i].GetWorldPose(out pos, out quat);
    tiresmeshes[i].position = pos;
            tiresmeshes[i].rotation = quat;
        }
}

Quaternion quatはちょっと理解不能です。

回転を表す複素数みたいな?

ちょっとスルーです。

 

GetWorldPoseっていうのは、

 

接地、サスペンションの制限、ステアリングの角度、回転の角度 (角度の単位は度) のためにホイールをカウントするワールド空間ポーズを取得します。

 

ワールド空間ポーズを取得というのが、不明ですが、

タイヤメッシュから、情報を得ているという事でしょうか?

 

タイヤにメッシュをつける 59分〜

全然、わかってないが、

タイヤにメッシュタイヤという子オブジェクトにしている。

 

メッシュのスクリプトの設定が変わるので、調整 61分40秒頃〜

この設定がうまくいってないと、

実際のタイヤが回転しない。

 

タイヤに回転力を与える1時間5分頃〜

public float maxTorque = 50f;

 

void FixedUpdate()

 

タイヤにステアリングをつける1時間7分頃〜

プログラム:

    wheelcolliders[0].steerAngle = 45f;
       wheelcolliders[1].steerAngle = 45f;

これは、0,1っていうのが、FL、FRになっているので、それが45°家事を切るという事ですね。

ステアリングっていうのは、ハンドルを想像してください。

 

45°は舵を切れたけど、自由に操作したいよねという事で、プログラムを書き換える。

float steer = Input.GetAxis(“Horizontal”);

        float finalAngle = steer * 45f;

        wheelcolliders[0].steerAngle = finalAngle;
        wheelcolliders[1].steerAngle = finalAngle;

 

horizontalっていうのが、右、左キーをって事で、

GetAxisっていうのは、ボタンを押すとって事ですね。

Inoutは入力。

 

アクセルをつける 1時間10分頃〜

プログラム

float steer = Input.GetAxis(“Horizontal”);
        float accelerate = Input.GetAxis(“Vertical”);

        float finalAngle = steer * 45f;

        wheelcolliders[0].steerAngle = finalAngle;
        wheelcolliders[1].steerAngle = finalAngle;

        for (int i = 0; i < 4; i++)
        {
            wheelcolliders[i].motorTorque = accelerate * maxTorque;
        }

 

 

Verticalで上下方向に入力できるという事です。

 

ここで、動かしてみると、

前進と後進が逆になってる場合があります。

 

そのやり方がわからなかったので、

 

車自体の向きを変えざるを得ませんでした。

 

1時間16分頃〜 重心設定

重心設定をしないと、カーブした時に、

転倒するので、その設定をしています。

 

プログラム。

private Rigidbody m_rigidBody;

 

void Start () {

m_rigidBody = GetComponent<Rigidbody>();
m_rigidBody.centerOfMass = centerOfMass.localPosition;

 

この動画の最終的なプログラム

動画だと、

プログラムがマジで見にくいので、

メモりました。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class car : MonoBehaviour {

    public float maxTorque = 50f;
    public Transform centerOfMass;

    public WheelCollider[] wheelcolliders = new WheelCollider[4];
    public Transform[] tiresmeshes = new Transform[4];

    private Rigidbody m_rigidBody;

    // Use this for initialization
    void Start () {

        m_rigidBody = GetComponent<Rigidbody>();
        m_rigidBody.centerOfMass = centerOfMass.localPosition;

}

    // Update is called once per frame

    private void Update()
    {
        UpdateMeshesPosition ();
    }

   void FixedUpdate()
    {
        float steer = Input.GetAxis(“Horizontal”);
        float accelerate = Input.GetAxis(“Vertical”);

        float finalAngle = steer * 45f;

        wheelcolliders[0].steerAngle = finalAngle;
        wheelcolliders[1].steerAngle = finalAngle;

        for (int i = 0; i < 4; i++)
        {
            wheelcolliders[i] . motorTorque = accelerate * maxTorque ;
                    }
        
    }

        void UpdateMeshesPosition () {
        for (int i = 0; i < 4; i++)
        {
            Quaternion quat;
            Vector3 pos;
            wheelcolliders[i].GetWorldPose(out pos, out quat);
                tiresmeshes[i].position = pos;
            tiresmeshes[i].rotation = quat;
        }

    }
}

 

まとめ

まだまだ、

理解不足。

 

動画のようにスムーズに動かないです。

 

P・S

何か疑問点や間違ってるなどなどありましたら、

ご気軽にご連絡ください。

 

補足や修正などをしていきたいと思います。

コメント

タイトルとURLをコピーしました