射线投射

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

在最基本的水平等级, 射线投射 是发射隐形射线从Vector3 点以特定方向传送的 BasePart 或1> Class.Terrain1> 细长度。一旦投射,您可以检测到射线是否击中4> Class.BasePart4> 或7> Class.Terrain7> 细

激光由漂浮的球体发射,而射线投射确定激光是否击中平台。被激光击中的平台会被永久摧毁。

投射射线

您可以使用 WorldRoot:Raycast() 方法(workspace:Raycast())从一个 Vector3 原始在 1>Datatype.Vector31> 方向上使用射线。

基础射线投射

local rayOrigin = Vector3.new(0, 0, 0)
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = workspace:Raycast(rayOrigin, rayDirection)

过滤

WorldRoot:Raycast() 接受一个可选的 RaycastParams 对象,让射线投射包括或排除某些 BaseParts ,或使用0>碰撞组0>。

钥匙描述
FilterDescendantsInstancesArray 的对象,其子对象在过滤射线投射候选人时使用。
FilterTypeEnum.RaycastFilterType列表,用于确定如何FilterDescendantsInstances阵列在射线投射操作中使用。
  • Exclude 每个 BasePart 是除了 除了 那些在数组列中对象的子对象以外的所有。
  • Include — 只有 BaseParts 是在阵列中的后代才被视为有效。
IgnoreWaterBoolean 确定是否考虑使用 材料射线投射到 Terrain
CollisionGroup用于射线投射操作的 群组 的字符串名称。
射线投射过滤器

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)

正确计算方向

当适用时,您可以使用知道的rayDirection向量,使用知道的起始点和目的地。 这很有用,当射线在两个可变的点之间投射时,例如从一个玩家角色到另一个。

  1. 原始加向量指示射线的目的地:

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

  2. 从方程式中的两个侧面减去 射线起始

    射线起始位置 + 射线方向射线起始位置 = 0> 射线目的地0> − 3> 射线起始位置3>

  3. 射线的方向等于目的地减去起始:

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


local rayOrigin = workspace.TestOrigin.Position
local rayDestination = workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local raycastResult = workspace:Raycast(rayOrigin, rayDirection)

检测击中

如果 射线投射操作 击中适合的 BasePartTerrain 细胞,一个 1> Datatype.RaycastResult1> 对象包含结果。 要测试命中,请确保结果不是 4> nil4> ,并使用以下属性为需要。

属性描述
InstanceClass.BasePart 或 Terrain 牢固体,射线斜过。
PositionVector3 位置的交叉点之间的射线和 Instance 之间的关系。
Distance射线起始点和交叉点之间的距离。
MaterialClass.BasePart 或 BasePart 在交叉点。
NormalVector3 的普通面的正常 vector。
射线投射检测

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