・ゲーム開発編:p.183「野菜とBoxの衝突判定のスクリプトを書く」から
・文法編:ジェネリクス など
ゲーム開発編:p.183「野菜とBoxの衝突判定のスクリプトを書く」から
p.184 Box.cs
using UnityEngine;
using UnityEngine.UI; //UnityUIのText用
public class Box : MonoBehaviour {
public Text scoretext; //UnityUIが提供するTextクラスを型とするパブリック変数
int score = 0; //スコアを扱うインスタンス変数を0で初期化
private void OnTriggerEnter2D(Collider2D other) { //野菜とボックスの衝突時に呼び出されるメソッド
Vegetable.Type typeA = GetComponent<Vegetable>().type; //ボックスの種類を得る
Vegetable.Type typeB = other.GetComponent<Vegetable>().type; //野菜の種類を得る
if (typeA == typeB) { //得た野菜型が等しい=野菜とボックスが一致?
score++; //スコアをインクリメント
scoretext.text = score.ToString(); //整数値を文字列化してTextオブジェクトに与える
Destroy(other.gameObject); //野菜オブジェクトを破棄することで消す
}
}
}
p.186 野菜とBoxの衝突判定のスクリプトを書く:OnTriggerEnter2Dメソッドについて
・BoxCollider2Dを設定してあるオブジェクトにおいて、このメソッドを実装することで、Unity側でオブジェクトの衝突を 検知して呼び出してもらえる ・この考え方はイベントリスナーとして汎用的に扱われており、言語やゲームエンジンによって実装方法や内部仕様が異なる。 ・Unityの場合「OnTrigger●」と「OnCollision●」があり、トリガーモードかどうかで使い分ける。 ・トリガーモード(p.182)は衝突時に跳ね返らないモードで、これをオンにすることで、衝突後に通過や破棄(画面から消す) したい場合に用いる。 ・また、「OnTrigger●」には「OnTriggerEnter」「OnTriggerExit」「OnTriggerStay」があり、それぞれ、衝突時、 衝突終了時、衝突中に対応して動作する
p.187 GetComponentメソッドでコンポーネントを取得する
・MonoBehaviourから継承したGetComponentメソッドを実行することで、自分自身や他のMonoBehaviour派生クラスオブジェクトの コンポーネントを取得できる ・GetComponentメソッドは型情報を引数(型パラメータ)として得ることができるジェネリクスメソッド(詳細は後述)なので、 今回はVegetableを型パラメータに指定している。 ・GetComponentメソッドで、Vegetableクラスオブジェクトが得られるので、その中で定義しているType型の変数typeを 「.type」で得ることができる ・Type型は列挙型で野菜の種類を示すので、Tomato, Gpepper, Broccoli, Potatoのどれかになり、Vegetable.Type型の 変数typeAに代入される ・これが、ボックスの種類(どの野菜か)を得ることになる ・OnTriggerEnter2DメソッドのCollider2D型の引数otherには、衝突相手である野菜が得られる ・よって、other.GetComponent メソッドで、同様の手順で野菜の種類が得られ、Vegetable.Type型の変数typeBに 代入される
p.189 GetComponentメソッドでコンポーネントを取得する:補足:ドット演算子
・「other.GetComponent().type」のように、ドットで「の」「に所属する」などを連続して表現できる ・複雑で可読性が下がると思われる場合は中間結果を変数に置くことで複数行に分割するとよい 例: Vegetable.Type typeB = other.GetComponent ().type; ↓ Vegetable work = other.GetComponent (); //①まず野菜オブジェクトを得る Vegetable.Type typeB = work.type; //②それから中にあるtypeを得る
p.189 GetComponentメソッドでコンポーネントを取得する:補足:null
・GetComponentメソッドがオブジェクトを得られなかった場合、異常終了せずに、nullが返される ・nullは無を意味するキーワードで、全ての参照型に対応できる特殊な値。 ・よって「参照型の変数 == null」というような比較が型に限定されずに可能 ・なお、int型などの値型や、Vector3などの構造体型は、nullの代入や比較は不可
p.189 数を増やしてBoxに入った野菜を削除する:補足:スコア処理
・scoretextは、UnityUIが提供するTextクラスを型とするパブリック変数 ・Textクラスには描画用の文字列を保持するstring型のインスタンス変数textが定義されている ・ここに文字列を代入することで、自動的に画面上に反映する(Unityが制御してくれる) ・スコアを持つ変数scoreはint型なので、string型にするためにToString()メソッドを用いている ・これは「"" + score」としてもOK
p.189 数を増やしてBoxに入った野菜を削除する:補足:Destory
・MonoBehaviourクラスから継承されているDestory()メソッドに、ゲームオブジェクトを引数として渡すことで、ゲームオブジェクトを 破棄できる ・OnTriggerEnter2DメソッドのCollider2D型の引数otherに対してgameObjectプロパティを指定することで、これに含まれる ゲームオブジェクトを得ることができる ・よって、other.gameObjectをDestory()メソッドに渡せば、一致するボックスに衝突してきた野菜がオブジェクトの破棄により 画面から消える
p.191 野菜の種類と関連するTextを指定する:補足
・② 1つめのText(Regacy)を[Scoretext]にドラッグ&ドロップ