在最基本的水平等级, 射线投射 是将定义长度的隐形射线从特定方向的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)
当适用时,您可以使用已知的 起源 和 目的地 计算未知的方向向量()。这对于在两个点之间投射射线有用,可以改变,例如从一个玩家角色到另一个。
起源加方向向量表示射线的目的地:
射线起源 + 射线方向 = 射线目的地
从方程的两侧减去 rayOrigin:
射线起源 + 射线方向 − 射线起源 = 射线目的地 − 射线起源
射线的方向等于目标减去起源:
射线方向 = 射线目的地 − 射线起源
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 ,或使用 碰撞集群 。
关键 | 描述 |
---|---|
FilterDescendantsInstances | Array 对使用在过滤射线投射候选人中的后裔的对象 |
FilterType | Enum.RaycastFilterType 枚列,决定如何使用 FilterDescendantsInstances 阵列在射线投射操作中。 |
IgnoreWater | 用于决定是否在射线投射对 水 材料时考虑该材料。 |
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 | Vector3 位置在射线和 Instance 之间的交点。 |
Distance | 射线起源和交叉点之间的距离。 |
Material | 在交叉点的 Enum.Material 或 BasePart 或 Terrain 的 。 |
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("Instance:", raycastResult.Instance)print("Position:", raycastResult.Position)print("Distance:", raycastResult.Distance)print("Material:", raycastResult.Material)print("Normal:", raycastResult.Normal)elsewarn("No raycast result!")end