ในระดับพื้นฐานที่สุด raycasting คือการส่งรังสีที่มองไม่เห็นจากจุด 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 ) โดยใช้ จุดกำเนิด และ จุดหมาย ที่รู้จักมันมีประโยชน์เมื่อโค้งรัศมีระหว่างสองจุดที่สามารถเปลี่ยนแปลงได้ เช่น จากตัวละครผู้เล่นหนึ่งไปยังอีก
ต้นกำเนิดบวกเวกเตอร์ทิศทางบ่งบอกถึงจุดหมายของรังสี:
rayOrigin + rayDirection = rayDestination
หัก rayOrigin จากทั้งสองด้านของสมการ:
rayOrigin + rayDirection − rayOrigin = 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 | The 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