Pada dasarnya, pemosisikan adalah tindakan mengirimkan sinar tak terlihat dari titik Vector3 ke arah tertentu dengan panjang yang ditentukan. Setelah dipancarkan, Anda dapat mendeteksi apakah sinar tersebut mengenai BasePart atau sel Terrain.
Anda dapat memancarkan sinar dengan metode WorldRoot:Raycast() (Workspace:Raycast()) dari asal Vector3 dalam arah 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)Ketika mungkin, Anda dapat menghitung vektor arah yang tidak diketahui (rayDirection) menggunakan asal dan tujuan yang diketahui. Ini berguna saat memancarkan sinar antara dua titik yang dapat berubah, seperti antara satu karakter pemain dengan karakter lainnya.
Asal ditambah vektor arah menunjukkan tujuan dari sinar:
Kurangi dari kedua sisi persamaan:
Arah sinar sama dengan tujuan dikurangi asal:
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)Opsi filter
WorldRoot:Raycast() menerima objek RaycastParams opsional yang memberi tahu pemosisikan untuk secara selektif menyertakan atau mengecualikan BaseParts tertentu, mengabaikan material Air untuk Terrain, atau menggunakan grup tabrakan.
| Kunci | Deskripsi |
|---|---|
| FilterDescendantsInstances | Array objek yang keturunannya digunakan dalam memfilter kandidat pemosisikan. |
| FilterType | Enum Enum.RaycastFilterType yang menentukan bagaimana array FilterDescendantsInstances digunakan dalam operasi pemosisikan. |
| IgnoreWater | Boolean yang menentukan apakah material Air dipertimbangkan saat pemosisikan terhadap Terrain. |
| CollisionGroup | Nama String dari grup tabrakan yang digunakan untuk operasi pemosisikan. |
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)Deteksi Tabrakan
Jika operasi pemosisikan mengenai BasePart atau sel Terrain yang memenuhi syarat, objek RaycastResult dikembalikan yang berisi hasilnya. Untuk menguji adanya tabrakan, pastikan hasilnya tidak nil dan gunakan properti berikut sesuai kebutuhan.
| Propert | Deskripsi |
|---|---|
| Instance | Objek BasePart atau sel Terrain yang terkena sinar. |
| Position | Posisi Vector3 dari titik persimpangan antara sinar dan Instance. |
| Distance | Jarak antara asal sinar dan titik persimpangan. |
| Material | Material Enum.Material dari BasePart atau Terrain pada titik persimpangan. |
| Normal | Vektor Vector3 dari vektor normal permukaan yang terkena. |
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("Tidak ada hasil pemosisikan!")
end