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)
			{
				Debug.Log(hit_info.transform.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)
			{
				Debug.Log(hit_info.transform.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)
			{
				Debug.Log(hit_info.transform.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)
				{
					Debug.Log(hit_list[i].transform.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)
				{
					Debug.Log(hit_list[i].transform.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)
				{
					Debug.Log(hit_list[i].transform.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

	・Gameビュー
		unity_0174

■LayerMaskについて

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

	unity_0172