Ray --2D--

バージョン情報

	5.3.7f1

RaycastHit2D

RaycastHit2DはRaycastの判定で交差していたゲームオブジェクトの情報や
交差情報などが格納されている2D用のクラスです。

情報内容

RaycastHitのメンバです。 ※よく利用するメンバを紹介しています。 ・collider 交差したゲームオブジェクトのCollider情報 2DのRayの判定では ・distance 交差したオブジェクトとの距離 ・transform 交差したオブジェクトのtransform情報 ・rigidbody 交差したオブジェクトのRigidbody ※関連付けがない場合はnull ・point 交差したオブジェクトの位置 transformなどは対象となるゲームオブジェクトの名前や 座標、gameObjectが取得できるの特に利用します。

判定メソッド

Rayによる交差判定のメソッドはPhysics2DクラスのRaycastRaycastAllがあります。
このメソッドは複数のオーバーロードが用意されているので一部のみ解説をします。

Raycast

RaycastはRayと複数のゲームオブジェクトで判定を行います。 複数のゲームオブジェクトと交差している場合は 最初に交差していると判定されたゲームオブジェクトが選択されます。 ・オーバーロードその1 戻り値: RaycastHit2D: Rayと交差情報が格納されているRaycastHit2D 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差判定の結果は戻り値としてRaycastHit2Dを返し、  その内容によって判断する 例: Vector2 pos = new Vector2(0.0f, 10.0f); Vector2 direction = new Vector2(0.0f, -1.0f); RaycastHit2D hit_info; /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f */ hit_info = Physics2D.Raycast(pos, direction); // colliderの中身が非nullなら交差有り if (hit_info.collider != null) { string name = hit_info.transform.name; Debug.Log(name + "と交差した"); } ・オーバーロードその2 戻り値: RaycastHit2D: Rayと交差情報が格納されているRaycastHit2D 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き float maxDistance: Rayの最大距離 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差判定の結果は戻り値としてRaycastHit2Dを返し、  その内容によって判断する ・判定には距離の指定があり、範囲外のゲームオブジェクトとは  判定を行わない 例: Vector2 pos = new Vector2(0.0f, 10.0f); Vector2 direction = new Vector2(0.0f, -1.0f); float max_distance = 10.0f; RaycastHit2D hit_info; /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f Rayの探索最大距離 10.0f */ hit_info = Physics2D.Raycast(pos, direction, max_distance); // colliderの中身が非nullなら交差有り if (hit_info.collider != null) { string name = hit_info.transform.name; Debug.Log(name + "と交差した"); } ・オーバーロードその3 戻り値: RaycastHit2D: Rayと交差情報が格納されているRaycastHit2D 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き float maxDistance: Rayの最大距離 int layerMask: 判定を行うレイヤーを指定するためのマスク 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差判定の結果は戻り値としてRaycastHit2Dを返し、  その内容によって判断する ・判定には距離の指定があり、範囲外のゲームオブジェクトとは  判定を行わない ・判定を行うゲームオブジェクトはlayerMaskに指定した  レイヤーのみが対象となる 例: Vector2 pos = new Vector3(0.0f, 10.0f); Vector2 direction = new Vector3(0.0f, -1.0f); RaycastHit2D hit_info; float max_distance = 10.0f; // "Character"と"Stage"レイヤーのみ交差させる int layer_mask = LayerMask.GetMask( new string[] { "Character", "Stage" }); /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f Rayの探索最大距離 10.0f マスクレイヤー: Characterレイヤー Stageレイヤー */ hit_info = Physics2D.Raycast(pos, direction, max_distance, layer_mask)) // colliderの中身が非nullなら交差有り if (hit_info.collider != null) { string name = hit_info.transform.name; Debug.Log(name + "と交差した"); }

RaycastAll

RaycastAllはRayと交差している全てのゲームオブジェクトを取得できます。 全てのオブジェクトの取得を行うので、通常のRaycastと比較して 処理コストが高くなっていることに注意が必要です。 ※.layerを使用して最低限の判定にするようしたりと最適化を行います ・オーバーロードその1 戻り値: RaycastHit2D[]: Rayと交差情報が格納されているRaycastHit2Dの配列 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差情報はRaycastHitの配列に格納され、戻り値として返る 例: Vector2 pos = new Vector3(0.0f, 10.0f); Vector2 direction = new Vector3(0.0f, -1.0f); RaycastHit2D[] hit_list; /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f */ hit_list = Physics2D.RaycastAll(pos, direction); for (int i = 0; i < hit_list.Length; i++) { if (hit_list[i].collider != null) { string name = hit_list[i].transform.name; Debug.Log(name + "と交差した"); } } ・オーバーロードその2 戻り値: RaycastHit2D[]: Rayと交差情報が格納されているRaycastHit2Dの配列 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き float maxDistance: Rayの最大距離 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差情報はRaycastHitの配列に格納され、戻り値として返る ・判定には距離の指定があり、範囲外のゲームオブジェクトとは  判定を行わない 例: Vector2 pos = new Vector3(0.0f, 10.0f); Vector2 direction = new Vector3(0.0f, -1.0f); RaycastHit2D[] hit_list; float max_distance = 10.0f;; /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f Rayの探索最大距離 10.0f */ hit_list = Physics2D.RaycastAll(pos, direction, max_distance); for (int i = 0; i < hit_list.Length; i++) { if (hit_list[i].collider != null) { string name = hit_list[i].transform.name; Debug.Log(name + "と交差した"); } } ・オーバーロードその3 戻り値: RaycastHit2D[]: Rayと交差情報が格納されているRaycastHit2Dの配列 引数: Vector2 origin: 開始位置と向きが設定されているRayの情報 Vector2 direction: Rayの向き float maxDistance: Rayの最大距離 int layerMask: 判定を行うレイヤーを指定するためのマスク 内容: ・引数に開始位置と向きを指定してゲームオブジェクトとの交差を判定する ・交差情報はRaycastHitの配列に格納され、戻り値として返る ・判定には距離の指定があり、範囲外のゲームオブジェクトとは  判定を行わない ・判定を行うゲームオブジェクトのLayerのマスク指定を行っており、  指定されたレイヤー以外は判定の対象外となる 例: Vector2 pos = new Vector3(0.0f, 10.0f); Vector2 direction = new Vector3(0.0f, -1.0f); RaycastHit2D[] hit_list; float max_distance = 10.0f; // "Character"と"Stage"レイヤーのみ交差させる int layer_mask = LayerMask.GetMask( new string[] { "Character", "Stage" }); /* Ray: 開始位置: X:0.0f Y:0.0f 向き: X:0.0f Y:-1.0f Rayの探索最大距離 10.0f マスクレイヤー: Characterレイヤー Stageレイヤー */ hit_list = Physics2D.RaycastAll(pos, direction, max_distance, layer_mask); for (int i = 0; i < hit_list.Length; i++) { if (hit_list[i].collider != null) { string name = hit_list[i].transform.name; Debug.Log(name + "と交差した"); } }

■可視化

Rayの可視化はDebugクラスのDrawRayを使用することで可能です。
Colliderと同様にRayの表示を行えるようにしたほうが、
デバッグ、調整で役立ちます。

●DrawRay
	戻り値:
		なし

	引数:
		Vector3:
			Rayの開始位置

		Vector3:
			Rayの向き

		Color:
			Rayの色

		float:
			描画時間(秒)

	内容:
		引数に指定した情報をもとにしてRayを描画する

	例:
		Vector3 pos = new Vector3(0.0f, 1.0f, 0.0f);
		Vector3 dir = new Vector3(0.0f, 10.0f, 0.0f);
		Color color = Color.red;
		float draw_time = 1.0f;

		Debug.DrawRay(pos, dir, color, draw_time);

●注意点
	Debug機能なので、Gameビューでの表示はされません。
	Sceneビューでのみ確認できますので、注意して下さい。

	・Sceneビュー
		unity_0173
		unity_0173

	・Gameビュー
		unity_0174
		unity_0174

■LayerMaskについて

Raycastで判定を行うマスク設定を行いますが、
指定がなかったとしてもレイヤーで「IgnoreRaycast」が
指定されているゲームオブジェクトは判定の対象に入りません。

	unity_0172
	unity_0172