おっさんプログラマのUnity奮闘記

元WEB系プログラマのUnity奮闘記

おっさんのUnity入門 衝突判定プログラム(コライダーの使い方)

Unity 2Dで衝突判定プログラムを作ってみます。


Unity 衝突判定

【用意するオブジェクト】
  • 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設定】

Enemyの設定

「is Trigger」にチェックを入れないとコライダーが物理的空間として認識されるためPLAYERがENEMYのコライダーを通過できなくなる。


PLAYERにRigidbody 2Dを追加する

物理動作のためにRigidbody 2Dを追加する。


オブジェクト衝突前
クリックしながらPLAYERを動かしていく。


オブジェクト衝突後
PLAYERがENEMYにのコライダーに接触するとPLAYERの色が変わる。


この記事のもっと詳しい内容を知りたい方はこちらのページををご覧ください。
【Unity 始め方 入門】詳しいサンプルコード付き プロジェクトの作成手順と衝突判定プログラム(コライダーの使い方)解説yokubari.online




独自ブログ始めました
よくばりオンラインyokubari.online