在其最基本的層面上,射線投射是從特定方向的 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)
在適用的情況下,您可以使用已知的 起點 和 終點 來計算未知的方向向量 (rayDirection)。這在在兩個可以變化的點之間發射射線時非常有用,例如從一個玩家角色到另一個玩家角色。
起點加上方向向量表示射線的目的地:
從方程式的兩側減去 :
射線的方向等於目的地減去起點:
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 | 射線與 Instance 的交點的 Vector3 位置。 |
| Distance | 射線起點與交點之間的距離。 |
| Material | 交點處的 BasePart 或 Terrain 的 Enum.Material。 |
| 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("實例:", raycastResult.Instance)print("位置:", raycastResult.Position)print("距離:", raycastResult.Distance)print("材質:", raycastResult.Material)print("法向:", raycastResult.Normal)elsewarn("沒有射線投射結果!")end