記事ディレクトリ
1. 定義
Unity では、レイ検出 (レイキャスティング) は、レイがシーン内のオブジェクトと交差するかどうかを検出するために一般的に使用されるテクノロジです。これは、クリック オブジェクト、光線兵器、キャラクターと環境間のインタラクションの衝突検出を実装するゲーム開発において非常に役立ちます。
2. 重要なクラスとメソッド
2.1 レイ
定義: 特定の方向に沿って点から伸びる仮想線分を表します
。
direction 射线的方向。
origin 射线的原点。
コンストラクタ:
public Ray (Vector3 origin, Vector3 direction);
シーン内に光線を描画します ([デバッグ] でのみ表示されます)。
// 创建射线
Ray ray = new Ray(Vector3.zero, Vector3.forward);
// 在场景中绘制射线,可选操作(仅用于调试目的)
Debug.DrawRay(ray.origin, ray0.direction * 10f, Color.red);
2.2 スクリーンから光線を放射する:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
void Update()
{
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red);
}
}
2.3 レイキャスト
定義: 光線検出は、交差する単一のオブジェクトを取得します。光線がオブジェクトと交差するかどうかを検出し、交差する場合は交差点に関する情報を取得します。
bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
パラメータの意味:
Ray - レイ オブジェクト
RaycastHit - 衝突 (交差点) オブジェクトの情報
maxDistance - レイ検出の最大距離
LayerMask - レイヤ マスク (特定のレイヤ オブジェクトのみを検出するために使用)
戻り値の意味:
bool - レイの場合、オブジェクトの場合は true を返します交差する
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
// 射线与物体相交
Debug.Log($"Name:{
hitInfo.collider.name},Point:{
hitInfo.point}");
}
}
}
2.4 レイキャストオール
定義: 光線検出は複数の交差するオブジェクトを取得します
RaycastHit[] RaycastAll(Ray ray, float maxDistance, int layerMask);
RaycastHit[] - 光線がオブジェクトと交差する場合、交差するオブジェクトが返されます。衝突がない場合、配列の長さは 0 です
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hitInfos;
hitInfos = Physics.RaycastAll(ray, int.MaxValue);
// 射线与物体相交
foreach (var item in hitInfos)
{
Debug.Log($"Name:{
item.collider.name},Point:{
item.point}");
}
}
}
2.5 RaycastHit 衝突情報
2.6 LayerMask により、指定されたレベルのオブジェクトのみを検出するレイ検出が可能になります
LayerMask.NameToLayer(层名)
: レイヤ名をレイヤ番号に変換する方法
レイヤ番号:
1 << LayerMask.NameToLayer(“Cube”)
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
// 1 << LayerMask.NameToLayer("Cube") 将 1 左移得到的层级编号位数,得到层级编号的二进制
if (Physics.Raycast(ray, out hitInfo, int.MaxValue, 1 << LayerMask.NameToLayer("Cube")))
{
// 射线与物体相交
Debug.Log($"Name:{
hitInfo.collider.name},Point:{
hitInfo.point}");
}
}
}