おっさんのUnity入門 衝突判定プログラム(コライダーの使い方)
Unity 2Dで衝突判定プログラムを作ってみます。
【用意するオブジェクト】
- PLAYER(スプライトをドロップして作成)
- ENEMY1(スプライトをドロップして作成)
- ENEMY2(スプライトをドロップして作成)
- CONTROLLER(空のオブジェクトで作成・スクリプト専用)
【実現したい動作】
- PLAYERとENEMY1またはENEMY2が衝突した結果をCONTROLLERに渡す
- CONTROLLERから渡した値を使ってPLAYERを操作する
- PLAYERに物理動作をさせる
【PLAYERのスクリプト】
/* PlayerController.cs */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] // Inspectorで状況を把握しやすいようにつけておく private int EnemyNum; // Enemyの番号 [SerializeField] private GameController GCScript; void Start () { // EnemyNumを初期化 EnemyNum = 0; // コントローラースクリプトを取得 GCScript = GameObject.Find ("CONTROLLER") .GetComponent<GameController>(); } // 毎フレーム呼び出されるメソッド void Update () { if (Input.GetMouseButtonDown (0)) { GetComponent<Rigidbody2D> ().velocity = new Vector2 (2, 6); // 上記スクリプトの詳細 // Rigidbody2D A = this.GetComponent<Rigidbody2D>(); // Vector2 B = new Vector2 (2, 6); // A.velocity = B; } // コントローラーからEnemyNumを取得 EnemyNum = GCScript.EnemyNumController; // Playerの色を変える PlayerChangeColor (EnemyNum); } // Playerの色を変える void PlayerChangeColor (int EnemyNum) { switch (EnemyNum) { case 0: Debug.Log (EnemyNum); gameObject.GetComponent<SpriteRenderer> () .color = new Color (0, 1, 0); break; case 1: Debug.Log (EnemyNum); gameObject.GetComponent<SpriteRenderer> () .color = new Color (1, 0, 0); break; case 2: Debug.Log (EnemyNum); gameObject.GetComponent<SpriteRenderer> () .color = new Color (0, 0, 1); break; default: break; } } }
【CONTROLLERのスクリプト】
/* GameController.cs */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameController : MonoBehaviour { [SerializeField] // Inspectorで状況を把握しやすいようにつけておく private int EnemyNum; // Enemyの番号 void Start () { // EnemyNumを初期化 EnemyNum = 0; } // EnemyNumのコントロール public int EnemyNumController { get { return EnemyNum; } // Enemyの番号を取得 set { EnemyNum = value; } // Enemyの番号を上書き } }
【ENEMYのスクリプト】
/* EnemyController.cs */ using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyController : MonoBehaviour { [SerializeField] private GameController GCScript; [SerializeField] // Inspectorで状況を把握しやすいようにつけておく private int EnemyNum; // コントローラーへ渡すEnemyの番号 private string objectName; // Enemy自身のオブジェクト名 void Start () { // コントローラースクリプトを取得 GCScript = GameObject.Find ("CONTROLLER") .GetComponent<GameController>(); //Debug.Log(GCScript); // EnemyNumを初期化 objectName = transform.name; // Enemy自身のオブジェクト名を取得 switch (objectName) { case "ENEMY1": EnemyNum = 1; break; case "ENEMY2": EnemyNum = 2; break; default: EnemyNum = 0; break; } } // Playerとの衝突判定を行う void OnTriggerEnter2D (Collider2D col) { //if (!col.gameObject.name.Equals ("PLAYER")) { // return; //} // 衝突判定後に自身の番号をコントローラーへ渡す if (col.gameObject.name.Equals ("PLAYER")) { GCScript.EnemyNumController = EnemyNum; } } void OnTriggerStay2D (Collider2D col) { // 衝突判定後に自身の番号をコントローラーへ渡す if (col.gameObject.name.Equals ("PLAYER")) { GCScript.EnemyNumController = EnemyNum; } } void OnTriggerExit2D (Collider2D col) { // 衝突判定後に自身の番号をコントローラーへ渡す if (col.gameObject.name.Equals ("PLAYER")) { GCScript.EnemyNumController = 0; } } }
【オブジェクトのis Trigger設定】
「is Trigger」にチェックを入れないとコライダーが物理的空間として認識されるためPLAYERがENEMYのコライダーを通過できなくなる。
物理動作のためにRigidbody 2Dを追加する。
クリックしながらPLAYERを動かしていく。
PLAYERがENEMYにのコライダーに接触するとPLAYERの色が変わる。
この記事のもっと詳しい内容を知りたい方はこちらのページををご覧ください。
【Unity 始め方 入門】詳しいサンプルコード付き プロジェクトの作成手順と衝突判定プログラム(コライダーの使い方)解説yokubari.online
独自ブログ始めました
よくばりオンラインyokubari.online