射线检测

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

在最基本的层面上,射线检测是从 Vector3 点以特定方向发送一条不可见的射线,长度是预定义的。一旦投射,您可以检测射线是否击中了 BasePartTerrain 单元。

激光由漂浮的光球发射,射线检测确定激光是否击中平台。被激光触碰到的平台会暂时被摧毁。

您可以使用 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)。这在从一个玩家角色到另一个玩家角色投射射线时尤其有用,因为这些点可能会变化。

  1. 原点加上一个方向向量表示射线的目标:

    rayOrigin+rayDirection=rayDestination\text{rayOrigin} + \text{rayDirection} = \text{rayDestination}

  2. 从等式的两边减去 rayOrigin\text{rayOrigin}

    rayOrigin+rayDirectionrayOrigin=rayDestinationrayOrigin\text{rayOrigin} + \text{rayDirection} - \text{rayOrigin} = \text{rayDestination} - \text{rayOrigin}

  3. 射线的方向等于目标减去原点:

    rayDirection=rayDestinationrayOrigin\text{rayDirection} = \text{rayDestination} - \text{rayOrigin}


local Workspace = game:GetService("Workspace")
local rayOrigin = Workspace.TestOrigin.Position
local rayDestination = Workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local 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.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {script.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
raycastParams.IgnoreWater = true
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)

碰撞检测

如果射线检测操作击中了符合条件的 BasePartTerrain 单元,将返回一个 RaycastResult 对象,其中包含结果。要测试是否击中,请确认结果不为 nil,并根据需要使用以下属性。

属性描述
Instance射线相交的 BasePartTerrain 单元。
Position射线与 Instance 相交的 Vector3 位置。
Distance射线原点与相交点之间的距离。
Material相交点处的 BasePartTerrainEnum.Material
Normal相交面法向量的 Vector3
射线检测击中检测

local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
if raycastResult then
print("实例:", raycastResult.Instance)
print("位置:", raycastResult.Position)
print("距离:", raycastResult.Distance)
print("材质:", raycastResult.Material)
print("法线:", raycastResult.Normal)
else
warn("没有射线检测结果!")
end
©2026 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。