Ray --3D--
バージョン情報
5.3.7f1
RaycastHit
RaycastHitはRaycastの判定で交差していたゲームオブジェクトの情報や
交差情報などが格納されいる3D用のクラスです。
情報内容
RaycastHitのメンバです。
※よく利用するメンバを紹介しています。
collider:
交差したゲームオブジェクトのCollider情報
distance:
交差したオブジェクトとの距離
transform:
交差したオブジェクトのtransform情報
rigidbody:
交差したオブジェクトのRigidbody
※関連付けがない場合はnull
point:
交差したオブジェクトの位置
transformなどは対象となるゲームオブジェクトの名前や
座標、gameObjectが取得できるの特に利用します。
判定メソッド
Rayによる交差判定のメソッドはPhysics2DクラスのRaycast、RaycastAllがあります。
このメソッドは複数のオーバーロードが用意されているので一部のみ解説をします。
Raycast
RaycastはRayと複数のゲームオブジェクトで判定を行います。
複数のゲームオブジェクトと交差している場合は
最初に交差していると判定されたゲームオブジェクトが選択されます。
オーバーロードその1
戻り値:
Rayが交差しているか
型:bool
true:交差している
false:交差していない
引数:
Ray ray:
開始位置と向きが設定されているRay
内容:
・Rayとゲームオブジェクトとの交差判定を行う
・交差していればtrue、交差していなければfalseを返す
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit hit_info = new RaycastHit();
/*
Ray:
開始位置:
X:0.0f
Y:0.0f
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
*/
if (Physics.Raycast(ray))
{
Debug.Log("何かと交差した");
}
・オーバーロードその2
戻り値:
Rayが交差しているか
型:bool
true:交差している
false:交差していない
引数:
Ray ray:
開始位置と向きが設定されているRay
out RaycastHit hitInfo
交差情報
float maxDistance:
Rayの最大距離
内容:
・Rayとゲームオブジェクトとの交際判定を行う
・判定には距離の指定があり、範囲外のゲームオブジェクトとは
判定を行わない
・交差していればtrueが返り、hitInfoに詳細情報が格納されている
out:
C#における参照渡しを示すキーワード
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit hit_info = new RaycastHit();
float max_distance = 10.0f;
/*
Ray:
開始位置:
X:0.0f
Y:0.0f
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
Rayの探索最大距離
10.0f
*/
if (Physics.Raycast(ray, out hit_info, max_distance))
{
Debug.Log(hit_info.transform.name + "と交差した");
}
・オーバーロードその3
戻り値:
Rayが交差しているかどうか
型:bool
true:交差している
false:交差していない
引数:
Ray ray:
開始位置と向きが設定されているRay
out RaycastHit hitInfo
交差情報
float maxDistance:
Rayの最大距離
int layerMask:
判定を行うレイヤーを指定するためのマスク
内容:
・Rayとゲームオブジェクトとの交差判定を行い、
交差していればtrueが返り、hitInfoに詳細情報が格納されている
・判定には距離の指定があり、範囲外のゲームオブジェクトとは
判定を行わない
・判定を行うゲームオブジェクトはlayerMaskに指定した
レイヤーのみが対象となる
out:
C#における参照渡しを示すキーワード
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit hit_info = new RaycastHit();
float max_distance = 10.0f;
// "Character"と"Stage"レイヤーのみ交差させる
int layer_mask = LayerMask.GetMask(new string[] { "Character", "Stage" });
/*
Ray:
開始位置:
X:0.0f
Y:0.0f
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
Rayの探索最大距離
10.0f
マスクレイヤー:
Characterレイヤー
Stageレイヤー
*/
if (Physics.Raycast(ray, out hit_info, max_distance, layer_mask))
{
Debug.Log(hit_info.transform.name + "と交差した");
}
RaycastAll
RaycastAllはRayと交差している全てのゲームオブジェクトを取得できます。
全てのオブジェクトの取得を行うので、通常のRaycastと比較して
処理コストが高くなっていることに注意が必要です。
※.layerを使用して最低限の判定にするようしたりと最適化を行います
・オーバーロードその1
戻り値:
Rayと交差情報が格納されているRaycastHitの配列
引数:
Ray ray:
開始位置と向きが設定されているRay
内容:
・Rayとゲームオブジェクトとの交差判定を行う
・交差情報はRaycastHitの配列に格納され、戻り値として返る
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit[] hit_list;
/*
Ray:
開始位置:
X:0.0f
Y:0.0f
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
*/
hit_list = Physics.RaycastAll(ray);
for (int i = 0; i < hit_list.Length; i++)
{
Debug.Log(hit_list[i].transform.name + "と交差した");
}
・オーバーロードその2
戻り値:
Rayと交差しているゲームオブジェクトの情報が格納されている
RaycastHitの配列
引数:
Ray ray:
開始位置と向きが設定されているRay
float maxDistance:
Rayの最大距離
内容:
・Rayとゲームオブジェクトとの交差判定を行う
・交差情報はRaycastHitの配列に格納され、戻り値として返る
・判定には距離の指定があり、範囲外のゲームオブジェクトとは
判定を行わない
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit[] hit_list;
float max_distance = 10.0f;;
/*
Ray:
開始位置:
X:0.0f
Y:0.0f
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
Rayの探索最大距離
10.0f
*/
hit_list = Physics.RaycastAll(ray, max_distance);
for (int i = 0; i < hit_list.Length; i++)
{
Debug.Log(hit_list[i].transform.name + "と交差した");
}
・オーバーロードその3
戻り値:
Rayと交差情報が格納されているRaycastHitの配列
引数:
Ray ray:
開始位置と向きが設定されているRay
float maxDistance:
Rayの最大距離
int layerMask:
判定を行うレイヤーを指定するためのマスク
内容:
・Rayとゲームオブジェクトとの交差判定を行う
・交差情報はRaycastHitの配列に格納され、戻り値として返る
・判定には距離の指定があり、範囲外のゲームオブジェクトとは
判定を行わない
・判定を行うゲームオブジェクトのLayerのマスク指定を行っており、
指定されたレイヤー以外は判定の対象外となる
例:
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
Vector3 direction = new Vector3(0.0f, -1.0f, 0.0f);
Ray ray = new Ray(pos, direction);
RaycastHit[] 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
Z:0.0f
向き:
X:0.0f
Y:-1.0f
Z:0.0f
Rayの探索最大距離
10.0f
マスクレイヤー:
Characterレイヤー
Stageレイヤー
*/
hit_list = Physics.RaycastAll(ray, max_distance, layer_mask);
for (int i = 0; i < hit_list.Length; i++)
{
Debug.Log(hit_list[i].transform.name + "と交差した");
}