在最基本的水平等级, 射线投射 是发射隐形射线从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>。
钥匙 | 描述 |
---|---|
FilterDescendantsInstances | Array 的对象,其子对象在过滤射线投射候选人时使用。 |
FilterType | Enum.RaycastFilterType列表,用于确定如何FilterDescendantsInstances阵列在射线投射操作中使用。 |
IgnoreWater | Boolean 确定是否考虑使用 水 材料射线投射到 Terrain 。 |
CollisionGroup | 用于射线投射操作的 群组 的字符串名称。 |
射线投射过滤器
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)
正确计算方向
当适用时,您可以使用知道的rayDirection向量,使用知道的起始点和目的地。 这很有用,当射线在两个可变的点之间投射时,例如从一个玩家角色到另一个。
原始加向量指示射线的目的地:
射线起始 + 射线方向 = 射线目的地
从方程式中的两个侧面减去 射线起始:
射线起始位置 + 射线方向 − 射线起始位置 = 0> 射线目的地0> − 3> 射线起始位置3>
射线的方向等于目的地减去起始:
射线方向 = 射线目的地 − 射线起源
local rayOrigin = workspace.TestOrigin.Positionlocal rayDestination = workspace.TestDestination.Positionlocal rayDirection = rayDestination - rayOriginlocal raycastResult = workspace:Raycast(rayOrigin, rayDirection)
检测击中
如果 射线投射操作 击中适合的 BasePart 或 Terrain 细胞,一个 1> Datatype.RaycastResult1> 对象包含结果。 要测试命中,请确保结果不是 4> nil4> ,并使用以下属性为需要。
属性 | 描述 |
---|---|
Instance | Class.BasePart 或 Terrain 牢固体,射线斜过。 |
Position | Vector3 位置的交叉点之间的射线和 Instance 之间的关系。 |
Distance | 射线起始点和交叉点之间的距离。 |
Material | Class.BasePart 或 BasePart 在交叉点。 |
Normal | Vector3 的普通面的正常 vector。 |
射线投射检测
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