本講座ではUnityで3Dレースゲームの作り方について説明しています。今回は第2回です。
前回、プロジェクトを立ち上げ、レーシングゲームに必要なアセットを準備し、コースマップを作成しました。
前回の記事 :
今回はプレイヤーとなる車を動かしていきましょう。実際にコードを記載して動かしていくので、VisualStudioやVisualStudioCodeなどコードエディタをあらかじめダウンロードしておきましょう。
では始めていきましょう!
なお、ここからUnityのHierarchyウインドウ、Inspectorウインドウ、Projectウインドウなどのウインドウ(または〇〇ビューという呼び方もする)のことを、そのままHierarchy、Inspectorなどと記載していきます。
RigidBodyとColliderコンポーネントを用いた車の設定
まず車に物理的な判定を持たせるために、「Rigidbody」「Collider」のコンポーネントを付与していきます。
Rigidbodyで車オブジェクトの物理設定を行う
Hierarchyで「Player」を選択して、Inspectorの「AddComponent」ボタンをクリックします。
すると下記のようなウインドウがでますので、上の検索欄に「Rigidbody」と入力して下に表示される「Rigidbody」を選択しましょう。すると「Player」に「Rigidbody」が付与されます。
Mass | 質量 (kg) |
Drag | 空気抵抗(0が抵抗なし) |
Angular Drag | 回転の空気抵抗(0が抵抗なし) |
Use Gravity | 重力の影響を受けるかのフラグ |
これらの項目を下記のように設定していきます。
1 2 3 4 |
Mass : 1000 Drag : 0.5 Angular Drag : 0.5 Use Gravity : true (チェックを入れる) |
Colliderコンポーネントで当たり判定を設定する
次にCollider(コライダー)を付与していきます。Colliderには形がたくさんありますが、今回は「Capsule Collider」を使用します。
タイヤにコライダーを付けて車が走れるようにする
移動処理を作成していきますが、その前にコライダーを追加していきます。
というのも現在カプセルを横にしたようなコライダーのみなので、このままだと横にコロコロ転がってしまいます。なので車の動きに近づけるようにタイヤ部分のコライダーを作成していきます。
タイヤ用のコライダー
まずHierarchyで「Player」を右クリック「3DObject/Cylinder」で円柱を2つ作成します。
それぞれ「FrontWheel」「RearWheel」とします。そしてこの円柱を横向きにして前2つのタイヤ、後ろ2つのタイヤにかぶるくらいの大きさに調整します。下記を参考にしてください。
配置できたら、「FrontWheel」「RearWheel」を選択してInspectorを見てください。これらのコライダーは「CapsuleCollider」になっているかと思います。これは文字通りカプセルの形をしているので円柱形ではありません。なのでこの「CapsuleCollider」を削除しましょう。
そして、「FrontWheel」「RearWheel」にそれぞれ「MeshCollider」を付与してください。「MeshCollider」ではメッシュ(この場合円柱)に合わせたコライダーになります。
そして「MeshCollider」の「Convex」のチェックを入れておきましょう(入れないと衝突できません)。
Layerの設定
次に「Layer」を設定します。Layer(レイヤー)とは簡単に言うとグループ分けするような機能です。
まずHierarchyで「Player」を選択しInspectorのほぼ一番上、名前の下の「Layer」という項目の右「Default」となっているところをクリックします。
出てきたウインドウの一番下の「AddLayer」をクリックするとInspectorが「Tag&Layer」という画面になりますので、ここで「Player」「PlayerWheel」という2つのレイヤーを追加します。
レイヤーの作成ができたら、まず「Player」を選択しInspectorで「Layer」を選択し先程作成した「Player」レイヤーに設定します。このとき下記のようなウインドウが出ます。
これは「この子オブジェクトも同じレイヤーに設定しますか?」という内容です。これは「Yes」を押しましょう。(Wheelのレイヤーも同時に変更されますので必ずこのあとにWheelのレイヤーを設定しましょう)
次に「FrontWheel」「RearWheel」を選択しこの2つは、「PlayerWheel」レイヤーに設定します。
そして、ここでUnityの上部Menu「Edit」をクリックし「ProjectSetting」を開きます。(画像はMacのウインドウですのでWindowsは少し見た目が違います)
開いたウインドウの左のメニューで「Physic」を選択し一番下のチェックマークがたくさんあるところを見てください。これはLayerごとにPhysic、つまり物理的な接触の可否を設定できます。
ここで設定するのは「Player」と「PlayerWheel」の交差するところにあるチェックマークです。このチェックーマークを外すことで「Player」のレイヤーが設定されているGameObjectと「PlayerWheel」のレイヤーが設定されているGameObjectの物理的な接触が不可能になります。
今回は車本体のコライダーとタイヤ部分のコライダーが接触不可能になり、今のようにめり込んだままでも影響がなくなります。
また、タイヤのコライダーの見た目は必要ないので「FrontWheel」「RearWheel」を選択しInspectorで「MeshRenderer」のチェックマークをはずして非アクティブにしましょう。これで見た目のみ消すことができます。
ここで一旦再生してみましょう。タイヤ部分が地面にめり込まないで地面に車が置かれているかと思います。(上記画像はまだタイヤのコライダーの見た目は消していない状態の画像です)
C#スクリプトを用いて車の移動を実装する
ではここからコードを書いて車を動かしていきます。
まず、「Assets/AppMain/Script」のフォルダ内で右クリックをして「Create/C#Script」で新しいスクリプトを作成し「PlayerController」という名前にしましょう。
そして作成した「PlayerController.cs」をHierarchyの「Player」にドラック&ドロップします。こうすることで「Player」に「PlayerController」を付与する事ができます。
では、「PlayerController.cs」を開きましょう。
スクリプトの基本
まず最初は下記のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
簡単に説明すると、「using ○○」という最初の記載は、「○○」にあたる「UnityEngine」などの名前空間(namespace)の処理を使用しますよ、という宣言になります。現状はおまじないだと思って「using」や「namespace」という言葉があるよ、というくらいに認識しておきましょう。
次の部分、
1 |
public class PlayerController : MonoBehaviour |
です。「PlayerController」という名前の公開された(public)クラス(class)ですよ、という意味です。
そして「MonoBehaviour」というクラスを継承しているという意味です。ここでは継承に関して詳しくは触れませんが、Unityで使う処理はこの「:MonoBehaviour」をつけることで使えるようになる、と覚えておきましょう。
その下
1 2 3 4 5 6 7 8 9 |
void Start() { } void Update() { } |
これはUnityにおける基本メソッドです。「Start」というのは、GameObjectの起動時に一回だけ自動的に実行される処理です。
「Update」はGameObjectが起動しているときに自動的に1フレーム毎に実行され続ける処理です。
最後に
1 2 |
// Start is called before the first frame update // Update is called once per frame |
ですが、これは「コメント」です。C#では行の先頭に「//」をつけることでその行はコメントとなり処理とは関係ない記載になります。もちろん日本語を書いてもOKです。このコメントは消してしまって大丈夫です。
今回はスマホなどの操作にも対応してゆく予定ですが、まずはEditor上で簡単に試せるようにPCのキーボード入力で動かしていきます。
キーボード入力で車が移動する処理の追加
では処理を記載して行きます。まずは追加後の全文をご覧ください。
まだ真っ直ぐしか進めませんが、このように動きます。
後ろ向きに移動する処理を作る
後ろの移動を作成します。やることは前と変わりません。PCでキーボードは「S」ボタンを押すと後ろに進むようにします。では下記のように「PlayerController.cs」に追加していきましょう。
(変化のないところは省略しています。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class PlayerController : MonoBehaviour { ・・・(省略しています) void FixedUpdate() { MoveUpdate(); } // ------------------------------------------------------------ /// <summary> /// 移動処理. /// </summary> // ------------------------------------------------------------ void MoveUpdate() { if( Input.GetKey( KeyCode.Space ) == true ) { rigid.AddForce( transform.forward * movePower, ForceMode.Force ); } if( Input.GetKey( KeyCode.S ) == true ) { rigid.AddForce( - transform.forward * movePower, ForceMode.Force ); } } } |
追加部分は「MoveUpdate」内の部分です。
1 2 3 4 |
if( Input.GetKey( KeyCode.S ) == true ) { rigid.AddForce( - transform.forward * movePower, ForceMode.Force ); } |
前に進むのと違うのは、if文の条件は「Sキーを押したら」にして、与える力にマイナスをつけて後ろ向きにしています。
このままで後ろに動きますが、前後同じスピードなので今の所少し違和感はあると思いますが、次回以降速度制限などで調整していきます。
また、今の状態だと車が何かに衝突した際などに転倒したりしてしまうと思います。このあたりも後々修正していきますね。
今回は以上になります。次回は横移動を作成し曲がれるようにしていきます。そして速度制限やカメラの調整もしていきます。
次回の記事 :
コメント