在最基本的层面上,射线检测是从 Vector3 点以特定方向发送一条不可见的射线,长度是预定义的。一旦投射,您可以检测射线是否击中了 BasePart 或 Terrain 单元。
您可以使用 WorldRoot:Raycast() 方法 (Workspace:Raycast()) 从 Vector3 原点在 Vector3 方向投射射线。
基本射线检测local Workspace = game:GetService("Workspace")local rayOrigin = Vector3.new(0, 0, 0)local rayDirection = Vector3.new(0, -100, 0)local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
在适用的情况下,您可以使用已知的 原点 和 目标 计算一个未知的方向向量 (rayDirection)。这在从一个玩家角色到另一个玩家角色投射射线时尤其有用,因为这些点可能会变化。
原点加上一个方向向量表示射线的目标:
从等式的两边减去 :
射线的方向等于目标减去原点:
local Workspace = game:GetService("Workspace")local rayOrigin = Workspace.TestOrigin.Positionlocal rayDestination = Workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
过滤选项
WorldRoot:Raycast() 接受一个可选的 RaycastParams 对象,该对象告知射线检测选择性地包含或排除某些 BaseParts,忽略 Terrain 的 水 材质,或使用碰撞组 collision group。
| 键 | 描述 |
|---|---|
| FilterDescendantsInstances | 用于过滤射线检测候选项的对象的 Array。 |
| FilterType | 决定如何在射线检测操作中使用 FilterDescendantsInstances 数组的 Enum.RaycastFilterType 枚举。 |
| IgnoreWater | 决定在对 Terrain 射线检测时是否考虑 水 材质的布尔值。 |
| CollisionGroup | 用于射线检测操作的 碰撞组 的字符串名称。 |
射线检测过滤local Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastParams = RaycastParams.new()raycastParams.FilterDescendantsInstances = {script.Parent}raycastParams.FilterType = Enum.RaycastFilterType.ExcluderaycastParams.IgnoreWater = truelocal raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)
碰撞检测
如果射线检测操作击中了符合条件的 BasePart 或 Terrain 单元,将返回一个 RaycastResult 对象,其中包含结果。要测试是否击中,请确认结果不为 nil,并根据需要使用以下属性。
| 属性 | 描述 |
|---|---|
| Instance | 射线相交的 BasePart 或 Terrain 单元。 |
| Position | 射线与 Instance 相交的 Vector3 位置。 |
| Distance | 射线原点与相交点之间的距离。 |
| Material | 相交点处的 BasePart 或 Terrain 的 Enum.Material。 |
| Normal | 相交面法向量的 Vector3。 |
射线检测击中检测local Workspace = game:GetService("Workspace")local rayOrigin = Vector3.zerolocal rayDirection = Vector3.new(0, -100, 0)local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)if raycastResult thenprint("实例:", raycastResult.Instance)print("位置:", raycastResult.Position)print("距离:", raycastResult.Distance)print("材质:", raycastResult.Material)print("法线:", raycastResult.Normal)elsewarn("没有射线检测结果!")end