射线投射

*此内容使用人工智能(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)

当适用时,您可以使用已知的 起源 和 目的地 计算未知的方向向量()。这对于在两个点之间投射射线有用,可以改变,例如从一个玩家角色到另一个。

  1. 起源加方向向量表示射线的目的地:

    射线起源 + 射线方向 = 射线目的地

  2. 从方程的两侧减去 rayOrigin

    射线起源 + 射线方向射线起源 = 射线目的地射线起源

  3. 射线的方向等于目标减去起源:

    射线方向 = 射线目的地射线起源


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 ,或使用 碰撞集群

关键描述
FilterDescendantsInstancesArray 对使用在过滤射线投射候选人中的后裔的对象
FilterTypeEnum.RaycastFilterType 枚列,决定如何使用 FilterDescendantsInstances 阵列在射线投射操作中。
IgnoreWater用于决定是否在射线投射对 水 材料时考虑该材料。
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 细胞。
PositionVector3 位置在射线和 Instance 之间的交点。
Distance射线起源和交叉点之间的距离。
Material在交叉点的 Enum.MaterialBasePartTerrain 的 。
NormalVector3 的交叉面的普通向量。
射线投射命中检测

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("Instance:", raycastResult.Instance)
print("Position:", raycastResult.Position)
print("Distance:", raycastResult.Distance)
print("Material:", raycastResult.Material)
print("Normal:", raycastResult.Normal)
else
warn("No raycast result!")
end