在最基本的水平等級, 射線投射 是將定長的、特定方向的隱形射線從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 + rayDirection = rayDestination
從方程的兩側減去 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 | 判斷是否將 水 材料考慮在射線投射對 Terrain 時。 |
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