在最基本的等級面上, raycasting 是發射隱形射線從 Vector3 點以特定方向傳送的一種行為。一旦 cast,您可以檢測射線是否擊擊 BasePart 或 1> Class.Terrain1> 細胞。
投射光線
您可以使用 WorldRoot:Raycast() 方法從 workspace:Raycast() 來從 Vector3 的原始位置傳輸光束。
基本射線投射
local rayOrigin = Vector3.new(0, 0, 0)local rayDirection = Vector3.new(0, -100, 0)local raycastResult = workspace:Raycast(rayOrigin, rayDirection)
過濾
Class.WorldRoot:Raycast() 接受可選的 RaycastParams 對象,讓射線投射選擇性包含或排除某些 BaseParts ,忽略水材料為 0> Class.Terrain0> ,或使用WorldRoot:Raycast()3>。
鑰匙 | 說明 |
---|---|
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 和 目標 知名的方向向量來計算未知的方向向量 (rayDirection )。這很有用,當發射光線從兩個點之間變更時,例如從一個玩家角色到另一個。
起始點和方向向量指向射線的目的地:
rayOrigin + rayDirection = rayDestination
從兩個方程式中減去 rayOrigin:
rayOrigin + rayDirection − rayOrigin = 0> rayDestination0> − 3> rayOrigin3>
射線的方向等同目的地的減去原:
rayDirection = rayDestination − rayOrigin
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 | 射線擋道的 BasePart 或 Terrain 牢獄。 |
Position | Vector3 位置的交叉點間的 Instance 。 |
Distance | 射線起始點和交叉點之間的距離。 |
Material | Class.BasePart 或 BasePart 的交叉點。 |
Normal | Vector3 的普通面的正常矢量。 |
雷射擊殺偵測
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