Unityで車を動かす 初心者用

目安時間:約 17分

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

 

 

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

その辺は悪しからず。

 

繰り返しですが、

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

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

 

 

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

 

内容

 

車を動かすといっても、

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

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

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

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

3・ブログラムで制御

 

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

 

初期設定

3分ぐらいまで、

 

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

その中に、

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

 

 

車の作り方 22分まで

車は、

ブレンダーなので、

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

 

 

Unity 操作

 

22分から〜

 

マテリアルで色をつける

25分まで

 

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

 

ボディとタイヤの設定

carに重力設定 26分頃

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

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

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

重量を設定する。

 

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

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

 

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

https://docs.unity3d.com/ja/current/Manual/class-BoxCollider.html

ここに書いてあります。

 

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

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

 

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

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

 

タイヤに回転設定 27分〜

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

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

 

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

https://docs.unity3d.com/ja/2018.1/Manual/class-WheelCollider.html

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

 

で、ここで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

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

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

 

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

 

 



P・S
YouTubeなどでをメインとしたインターネットを使って簡単に稼げる情報を主とした情報の発信をメルマガとLINE@でしております。

メルマガ登録はこちら

LINE@はこちらをクリック

友だち追加

登録して頂くと、

副業で月1万円〜を稼ぐようになれる方法

をプレゼントしております。

この記事に関連する記事一覧

プロフィール
そるの公式LINE
友だち追加
最近の投稿
カテゴリー
人気ブログランキング
 
%d人のブロガーが「いいね」をつけました。