unity Physics.Raycast方法
·
Physics.Raycast 是 Unity 提供的一个物理射线检测方法,用于从一个点沿某个方向发射一条射线,检测是否与物体(带有 Collider 的物体)发生碰撞。
它常用于:
- 鼠标点击射线检测(如点击物体)。
- 射击武器的命中检测。
- 碰撞检测(如角色检测地面或墙壁)。
- 视线检测(如判断某点是否被遮挡)。
一、函数签名
(1)Unity 提供了多种重载版本的 Physics.Raycast 函数,以下是常见的签名:
bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
参数解释
-
Vector3 origin- 射线的起点(世界坐标系中的位置)。
- 通常是摄像机、角色位置或某个物体的起始点。
-
Vector3 direction- 射线的方向(一个归一化的向量)。
- 决定射线的发射方向。
-
float maxDistance- 射线的最大长度(可选,默认为无穷大
Mathf.Infinity)。 - 通过此参数可以限制射线的检测范围,超出范围的物体不会被检测到。
- 射线的最大长度(可选,默认为无穷大
-
int layerMask- 用于过滤检测的层级(可选,默认检测所有层)。
- 通过设置 LayerMask,你可以选择射线仅检测某些特定的物体。
-
QueryTriggerInteraction queryTriggerInteraction- 决定射线是否与触发器(
isTrigger为true的Collider)发生交互(可选,默认使用全局设置)。 - 可选值:
UseGlobal:使用全局设置。Ignore:忽略触发器。Collide:检测触发器。
- 决定射线是否与触发器(
(2)带返回信息的 Physics.Raycast
bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
新增参数
out RaycastHit hitInfo- 通过
out参数返回RaycastHit结构体,包含射线检测到的碰撞信息(如碰撞点、法线、碰撞物体等)。
- 通过
RaycastHit 的常见属性
hitInfo.point:碰撞发生的世界坐标。hitInfo.collider:与射线碰撞的Collider组件。hitInfo.transform: 与射线碰撞的物体的Transform组件。hitInfo.distance:射线起点到碰撞点的距离。
二、常用示例
(1)检测鼠标点击的物体
void Update()
{
// 从摄像机发射射线到鼠标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, 100f))
{
Debug.Log("Hit object: " + hit.collider.name); // 输出被点击的物体名称
Debug.DrawLine(ray.origin, hit.point, Color.red); // 在 Scene 视图中画出射线
}
}
(2)检测特定层的物体
void Update()
{
// 设置只检测 "Enemy" 层
int layerMask = LayerMask.GetMask("Enemy");
// 从摄像机发射射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction, out RaycastHit hit, Mathf.Infinity, layerMask))
{
Debug.Log("Hit Enemy: " + hit.collider.name);
}
}
(3)检测触发器和普通碰撞体
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 忽略触发器
if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, Physics.DefaultRaycastLayers, QueryTriggerInteraction.Ignore))
{
Debug.Log("Hit non-trigger object: " + hit.collider.name);
}
}
更多推荐

所有评论(0)