射線投射

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

當適用時,您可以使用已知的 起源 和 目的地 計算未知的方向向量()。這對於在兩個點之間投射光線有用,可以改變,例如從一名玩家角色到另一名玩家角色。

  1. 起源加方向向量指示射線的目的地:

    rayOrigin + rayDirection = rayDestination

  2. 從方程的兩側減去 rayOrigin

    射線起源 + 射線方向射線起源 = 射線目的地射線起源

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

    射線方向 = 射線目的地 - 射線起源


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 陣列。
  • Exclude — 每個 BasePart 都被視為 除了 那些是阵陣列中對象的子孫。
  • Include — 只有 BaseParts 是陣列中對象的後裔被考慮。
IgnoreWater判斷是否將 材料考慮在射線投射對 Terrain 時。
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 細胞。
PositionVector3 位置在光束和Instance之間的交點。
Distance射線起點和交點之間的距離。
Material在交叉點的 Enum.MaterialBasePartTerrain 的 。
NormalVector3 的交叉面的正常向量。
射線投射檢測

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("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