本講座ではUnityで3Dレースゲームの作り方について解説しています。今回は第4回です。
今回は第四回となります。
前回はプレイヤーのカーブ(横移動処理)、アクセルの速度制限、背後に存在するカメラの追跡処理を作成しました。
前回の記事 :
今回はレースゲームに必須のスタート、ゴールなどを判定するためのゲートを作成します。またユーティリティに使えるコライダーのレシーバーを作成していきます。
では始めていきましょう!
汎用スクリプト ColliderCallReceiverスクリプトの作成
Gateの処理を作成する前に、ここでユーティリティ(便利)なスクリプトを作成していきます。
これは、コライダーが接触、侵入などをした時にイベントを発行して使いやすくするためのものです。
Projectウインドウ、「Assets/AppMain/Script」で右クリック「Create/C# Script」で新しいスクリプトを作成し名前を「ColliderCallReceiver」とします。
まずは全文をご覧ください。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; // ------------------------------------------------------------------------- /// <summary> /// コライダーコールバックの受信ユーティリティクラス. /// </summary> // ------------------------------------------------------------------------- public class ColliderCallReceiver : MonoBehaviour { // コライダーイベント定義クラス. public class CollisionEvent : UnityEvent<Collision>{} // コライダーエンターイベント. public CollisionEvent CollisionEnterEvent = new CollisionEvent(); // コライダーステイイベント. public CollisionEvent CollisionStayEvent = new CollisionEvent(); // コライダーイグジットイベント. public CollisionEvent CollisionExitEvent = new CollisionEvent(); // トリガーイベント定義クラス. public class TriggerEvent : UnityEvent<Collider>{} // トリガーエンターイベント. public TriggerEvent TriggerEnterEvent = new TriggerEvent(); // トリガーステイイベント. public TriggerEvent TriggerStayEvent = new TriggerEvent(); // トリガーイグジットイベント. public TriggerEvent TriggerExitEvent = new TriggerEvent(); void Start() { } // ------------------------------------------------------------------------- /// <summary> /// コライダーエンターコールバック. /// </summary> /// <param name="col"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnCollisionEnter( Collision col ) { CollisionEnterEvent?.Invoke( col ); } // ------------------------------------------------------------------------- /// <summary> /// コライダーステイコールバック. /// </summary> /// <param name="col"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnCollisionStay( Collision col ) { CollisionStayEvent?.Invoke( col ); } // ------------------------------------------------------------------------- /// <summary> /// コライダーイグジットコールバック. /// </summary> /// <param name="col"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnCollisionExit( Collision col ) { CollisionExitEvent?.Invoke( col ); } // ------------------------------------------------------------------------- /// <summary> /// トリガーエンターコールバック. /// </summary> /// <param name="other"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnTriggerEnter( Collider other ) { TriggerEnterEvent?.Invoke( other ); } // ------------------------------------------------------------------------- /// <summary> /// トリガーステイコールバック. /// </summary> /// <param name="other"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnTriggerStay( Collider other ) { TriggerStayEvent?.Invoke( other ); } // ------------------------------------------------------------------------- /// <summary> /// トリガーイグジットコールバック. /// </summary> /// <param name="other"> 接触したコライダー. </param> // ------------------------------------------------------------------------- void OnTriggerExit( Collider other ) { TriggerExitEvent?.Invoke( other ); } } |
これは丸々コピーでOKです。
簡単に解説すると「OnCollision○○」「OnTrigger○○」というのは、Unityに用意されているコールバック(コールバックとは、何か特定の処理が行われたときに呼び出される関数と考えればOKです)です。
これをコライダーを持ったGameObjectに付与されているコードに書いておくと、コライダーの接触や侵入に応じて自動的に予め設定した処理が実行されます。
こうしたコライダー接触判定の際に行われる処理を一つにまとめるためのスクリプトをここで作成しました。
スタート位置の作成
Gateの調整
ひとまずこの先Gateにオブジェクトを追加していくので、最初に作成した「Gate」の子のオブジェクトの名前をわかりやすくしていきます。
「Gate」を選択し、子の「Cube」を「Top」、「Cyllinder」をそれぞれ「Left」「Right」という名前に変更します。(わかりやすいように、だけですのでお好きに設定してOKです)
Gateの前後コライダーの作成
では処理を作成していきます。
簡単にイメージするとゲートにTriggerコライダー(衝突判定を持たないコライダー)を設置して、そこを車が通ったらラップをカウントすればいいかな?と思いますが、そうすると逆走でもカウントされてしまいますね。
いろんな解決法はありますが、ここでは前と後ろの2つコライダーを設けてどちらから来たのかを判定していきたいと思います。
ではまず、その前後のコライダーを作成します。これは「Cube」を適当に広げて、見た目を消して作成します。「Gate」の子に「Cube」を2つ作成。それらを「front」「back」という名前にします。それらを下記のような大きさ、位置に調整しましょう。
1 2 3 4 5 6 7 8 9 |
front の Transform Position( 0.8, -2, 0 ) Rotation( 0, 0, 0 ) Scale( 0.5, 10, 30 ) back の Transform Position( -0.8, -2, 0 ) Rotation( 0, 0, 0 ) Scale( 0.5, 10, 30 ) |
そしてこれら二つのコライダーを選択して、Inspectorでそれぞれの「BoxCollider」の「IsTrigger」にチェックをいれます。
さらにこれら二つに先に作成した「ColliderCallReceiver.cs」を付与します。ProjectウインドウからHierarchyの各GameObjectにドラック&ドロップします。
見た目を消していない状態では下記のようになります。
確認できたら見た目を消しましょう。「front」「back」を選択しInspectorの「MeshRenderer」の名前の左側のチェックマークを外します。すると見た目のみ消えます。
GateControllerの作成
ここからコードを書いていきますが、その前に「PlayerController.cs」に追記する必要があるので先にそちらを追記しましょう。(変更のない部分は省略しています)
テストプレイ
ここまでで設定が完了したのでテストをしてみましょう。ゲート前からスタートしてUnityのログに「Lap 1」もう一周したら「Lap 2」、逆走してゲートをくぐったら「逆走 Lap 0やLap 1」などが表示されることを確認しましょう。
これができればちゃんと周回数が数えられていますので◯周でゴールという処理が作成できます。
今回はここまでにしましょう。次回スタート、ゴールから作成して一人でのレースができるようにしていきます。
次回の記事 :
コメント