射線投射

*此內容是使用 AI(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)

在適用的情況下,您可以使用已知的 起點終點 來計算未知的方向向量 (rayDirection)。這在在兩個可以變化的點之間發射射線時非常有用,例如從一個玩家角色到另一個玩家角色。

  1. 起點加上方向向量表示射線的目的地:

    rayOrigin+rayDirection=rayDestination\text{rayOrigin} + \text{rayDirection} = \text{rayDestination}

  2. 從方程式的兩側減去 rayOrigin\text{rayOrigin}

    rayOrigin+rayDirectionrayOrigin=rayDestinationrayOrigin\text{rayOrigin} + \text{rayDirection} - \text{rayOrigin} = \text{rayDestination} - \text{rayOrigin}

  3. 射線的方向等於目的地減去起點:

    rayDirection=rayDestinationrayOrigin\text{rayDirection} = \text{rayDestination} - \text{rayOrigin}


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 單元。
Position射線與 Instance 的交點的 Vector3 位置。
Distance射線起點與交點之間的距離。
Material交點處的 BasePartTerrainEnum.Material
Normal交叉面法向量的 Vector3
射線投射擊中檢測

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("實例:", raycastResult.Instance)
print("位置:", raycastResult.Position)
print("距離:", raycastResult.Distance)
print("材質:", raycastResult.Material)
print("法向:", raycastResult.Normal)
else
warn("沒有射線投射結果!")
end
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。