Unityで車を動かすって調べると、
自分からすると、
意味不明だったので、
ポンコツ素人目線でお伝えできたらなと思います。
というより、
自分の復習用にメモとして残します。
一回やっただけだと、
激しく忘れる上に、
動画だと、どこで何をやってるのかがわからないので、
結局、最初から最初まで見なきゃいけないのもあったので、
文字で残すと案外わかりやすいので、
文字の力を使います。
正確な言葉や理解ではないので、
その辺は悪しからず。
繰り返しですが、
まともに書けば書くほど、
理解し難いものになると思うので、勘違いも多いにあると思って呼んでください。
この動画を真似て見たいと思います。
Unityでの内容
車を動かすといっても、
モーターとかエンジンとかそういったものはいりません。
タイヤとボディがあれば、できます。
1・ブレンダーでボディとタイヤを作成
2・ボディとタイヤの設定
3・ブログラムで制御
大まかないいうとこんな内容になっています。
Unityでの初期設定
3分ぐらいまで、
carっていうゲームオブジェクトを作り、
その中に、
ボックスコライダー(重力設定)、ホイールコライダー(タイヤの回転)、メッシュ(モデルを入れる)
車の作り方 22分まで
車は、ブレンダーなので、
正直、説明は別で書くべき時が、きたら書きます。
Unityでの操作
22分から〜
マテリアルで色をつける
25分まで
ボディとタイヤに色をつける方法を解説しています。
ボディとタイヤの設定
carに重力設定 26分頃
全体のcarに重力設定をします。
carを選択し、インスペクターの中の
コンポーネントを追加→phisics→リジットボディ
重量を設定する。
ボディにボックスコライダー
車のボディにボックスコライダーの設定をする。27分30秒まで
ボックスコライダーって何?
ここに書いてあります。
つまり、ボディに重力の設定をするということですね。
車を動かした時に、重力の設定をしてないと、ボディが浮いたままの挙動になります。
見ていただくと、わかりますが、大まかな設定になってますね。
つまり、それでも大丈夫ということです。
タイヤに回転設定 27分〜
※メインのcarの重力設定をしなかった為に、(実態がないから?)
ホイールコライダーを設定することができませんでした。
wheelcolliderとは、タイヤの特にホイールを回転させる為みたいです。
ここに詳しく書いてあります。
で、ここで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
何か疑問点や間違ってるなどなどありましたら、
ご気軽にご連絡ください。
補足や修正などをしていきたいと思います。
コメント