WorldRoot
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Kelas dasar ini menyediakan API untuk instance apa pun yang dimaksudkan untuk menangani pencarian dan simulasi spasial 3D, seperti Workspace dan WorldModel.
Rangkuman
Properti
Properti diwarisi dari ModelMengatur tingkat rincian pada model untuk pengalaman dengan streaming instansi diaktifkan.
Mengontrol perilaku streaming model di Models ketika streaming instansi diaktifkan.
Bagian utama dari Model , atau nil jika tidak secara eksplisit ditetapkan.
Properti hanya editor yang digunakan untuk memperluas model di sekitar titik pivotnya. Mengatur properti ini akan memindahkan skala seolah-olah Model/ScaleTo dipanggil di atasnya.
Menentukan di mana titik pivot dari yang tidak memiliki set terletak.
Metode
Kembalikan benar jika salah satu dari yang diberikan BasePart menyentuh bagian lain.
Memancarkan bentuk blok dalam arah tertentu dan kembalikan RaycastResult jika bentuk memukul sel BasePart atau Terrain .
Kembalikan array bagian yang mana kotak batasnya tumpang tindih pada kotak tertentu.
Kembalikan array bagian yang mana kotak batasnya tumpang tindih pada bidang tertentu.
Kembalikan array bagian yang ruangnya dibagikan dengan bagian yang diberikan.
- IKMoveTo(part : BasePart,target : CFrame,translateStiffness : number,rotateStiffness : number,collisionsMode : Enum.IKCollisionsMode):()
Pindahkan bagian yang ditentukan ke lokasi yang ditentukan melalui kinematika terbalik daripada langsung memindahkannya ke sana, untuk memastikan setiap persyaratan, batasan, atau tabrakan yang diikuti bagian tersebut tetap puas secara fisik.
Melemparkan sinar menggunakan asal, arah, dan opsional RaycastParams , kemudian mengembalikan RaycastResult jika objek atau wilayah yang memenuhi syarat berinterseks dengan sinar.
- Spherecast(position : Vector3,radius : number,direction : Vector3,params : RaycastParams):RaycastResult?
Memancarkan bentuk bola di arah tertentu dan kembalikan RaycastResult jika bentuk memukul sel BasePart atau Terrain .
Memajukan simulasi untuk bagian di dunia ke depan berdasarkan peningkatan waktu yang ditentukan dan satu set opsi BaseParts .
Atur model ini menjadi permanen untuk pemain yang ditentukan. ModelStreamingMode harus diatur menjadi PersistentPerPlayer agar perilaku dapat diubah sebagai hasil dari penambahan.
Kembalikan deskripsi volume yang berisi semua bagian dari Model.
Kembalikan ukuran kotak batas terkecil yang berisi semua BaseParts di dalam Model, sesuai dengan Model.PrimaryPart jika diatur.
Kembalikan semua objek Player yang persisten untuk objek model ini.Perilaku bervariasi tergantung pada apakah metode ini dipanggil dari Script atau LocalScript.
Kembalikan skala kanonik model, yang defaultnya adalah 1 untuk model yang baru dibuat dan akan berubah saat skalanya diubah melalui Model/ScaleTo .
Pindahkan PrimaryPart ke posisi yang diberikan. Jika bagian utama belum ditentukan, bagian akar model akan digunakan.
Membuat model ini tidak lagi permanen untuk pemain yang ditentukan. ModelStreamingMode harus diatur ke PersistentPerPlayer agar perilaku berubah sebagai hasil dari penghapusan.
Mengatur faktor skala model, menyesuaikan ukuran dan lokasi semua Instans anak sehingga mereka memiliki faktor skala relatif terhadap ukuran dan lokasi awal mereka saat faktor skala adalah 1.
Bergeser ke Model dengan offset yang diberikan Vector3 , menyimpan orientasi model.Jika lain BasePart atau Terrain sudah ada di posisi baru maka Model akan tumpang tindih dengan objek yang dikatakan.
Mendapatkan pivot dari PVInstance .
Mengubah PVInstance bersama dengan semua keturunannya PVInstances sehingga pivot sekarang terletak di lokasi yang ditentukan CFrame .
Properti
Metode
ArePartsTouchingOthers
ApakahBagianMenyentuhLainnya kembali benar jika setidaknya satu dari yang diberikan BasePart menyentuh bagian lain.Dua bagian dianggap "menyentuh" jika berada dalam ambang batas jarak, overlapIgnored .
Jika tidak ada bagian yang disediakan, false dikembalikan.
Parameter
Daftar periksa bagian untuk melihat apakah ada bagian di daftar yang menyentuh bagian lain yang tidak ada di daftar.
Ambang batas penumpangan bagian dalam stud yang diabaikan sebelum bagian dianggap berhubungan.
Memberikan nilai
Contoh Kode
Blok kode di bawah ini menunjukkan cara menggunakan WorldRoot:ArePartsTouchingOthers() untuk memeriksa apakah bagian dalam daftar menyentuh bagian mana pun di ruang kerja yang tidak ada dalam daftar.
Pertama, skrip membuat dua bagian kotak yang tumpang tindih 1 stud, Part1 dan Part2 .Kemudian, ia mencetak nilai yang dikembalikan oleh ArePartsTouchingOthers() saat Part1 disampaikan di partList pada tiga nilai overlap yang berbeda: 0 , 0.999 , dan 1 .Dua kali pertama ArePartsTouchingOthers() dipanggil kembali false karena nilai overlap kurang dari jarak yang Part1 dan Part2 tumpang.Panggilan ketiga mengembalikan true karena nilai overlap sama dengan jarak di mana bagian-bagian tumpang tindih.
local part1 = Instance.new("Part")
part1.Name = "Part1"
part1.Anchored = true
part1.Transparency = 0.5
part1.Color = Color3.fromRGB(185, 100, 38)
part1.Size = Vector3.new(2, 2, 2)
part1.Position = Vector3.new(0, 4, 0)
part1.Parent = workspace
local part2 = Instance.new("Part")
part2.Name = "Part2"
part2.Anchored = true
part2.Transparency = 0.5
part2.Color = Color3.fromRGB(200, 10, 0)
part2.Size = Vector3.new(2, 2, 2)
part2.Position = Vector3.new(0, 5, 0)
part2.Parent = workspace
local partList = { part1 }
print(workspace:ArePartsTouchingOthers(partList, 0)) -- Benar
print(workspace:ArePartsTouchingOthers(partList, 0.999)) -- Benar
print(workspace:ArePartsTouchingOthers(partList, 1)) -- False
Blockcast
Memancarkan bentuk blok dalam arah tertentu dan mengembalikan kolisi pertama dengan sel BasePart atau Terrain .Ini mirip dengan cara WorldRoot:Raycast() melemparkan sinar linier ke arah untuk menemukan kolisi, tetapi menggunakan bentuk 3D alih-alih sinar.
Tidak seperti WorldRoot:GetPartsInPart() , metode ini tidak mendeteksi BaseParts bahwa awalnya memotong bentuk.
Jika sebuah hit terdeteksi, RaycastResult dikembalikan yang berisi informasi hit.Properti Distance mewakili jarak yang harus ditempuh bentuk untuk menemukan hit, dan properti Position mewakili titik intersepsi yang menyebabkan hit.
Metode ini menyebabkan kesalahan jika diberikan input tidak valid CFrame , ukuran, atau arah.
Parameter
Posisi awal dan rotasi bentuk blok lemparan.
Ukuran blok lemparan dalam stud. Ukuran maksimum adalah 512 stud.
Arah dari shapecast, dengan magnitudo yang mewakili jarak maksimum yang dapat ditempuh bentuk. Jarak maksimum adalah 1024 stud.
Memberikan nilai
Contoh Kode
Casts a block and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castBlock()
-- The initial position and rotation of the cast block shape
local originCFrame = CFrame.new(Vector3.new(0, 50, 0))
-- The size of the cast block shape
local size = Vector3.new(6, 3, 9)
-- The direction the block is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the cast
local distance = 50
-- Cast the block and create a visualization of it
local raycastResult = Workspace:Blockcast(originCFrame, size, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Block intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between block's initial position and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a block every 2 seconds
while true do
castBlock()
task.wait(2)
end
BulkMoveTo
Fungsi ini memindahkan tabel dari BaseParts ke tabel dari CFrames tanpa perlu menembakkan peristiwa default property Changed .Ini memberikan cara yang sangat cepat untuk memindahkan banyak bagian, karena Anda tidak perlu membayar biaya set properti terpisah untuk setiap bagian individu.
Argumen ketiga memungkinkan Anda untuk lebih mem optimalkan operasi gerakan.Secara default, acara Changed dari setiap bagian menyala untuk Position , Orientation , dan CFrame .Namun, jika Anda menyebutkan FireCFrameChanged sebagai argumen ketiga, hanya acara Changed untuk properti CFrame yang akan ditembak.
Perhatikan bahwa Anda hanya harus menggunakan fungsi ini jika Anda yakin bahwa gerakan bagian adalah botol leher di kode Anda.Hanya dengan mengatur properti CFrame dari bagian individual dan model las adalah cukup cepat dalam sebagian besar kasus.
Parameter
Memberikan nilai
GetPartBoundsInBox
WorldRoot:GetPartBoundsInBox() kembali array bagian yang mana kotak pengikatnya tumpang tindih pada kotak yang volumenya dijelaskan menggunakan pusat yang diberikan ( CFrame ) dan ukuran ( Vector3 ).
Seperti disoroti, metode pencarian spasial ini secara efisien mempertimbangkan volume kotak pengikat bagian daripada volume yang sebenarnya ditempati.Ini mungkin penting saat mempertimbangkan silinder, bola, serikat, dan MeshParts yang memiliki bentuk blok tidak.Untuk kasus di mana akurasi sangat penting, gunakan WorldRoot:GetPartsInPart() sebagai gantinya, atau filter lebih lanjut hasil metode ini sendiri.
Metode ini menggunakan objek untuk menggambarkan bagian yang dapat digunakan kembali dari pencarian spasial, seperti daftar pengecualian atau pengecualian, jumlah bagian maksimum untuk dipertanyakan, grup kolisi apa yang harus digunakan, dan apakah pencarian memfavoritkan nilai bagian yang tertumpang atas nilainya.
Parameter
Lokasi pusat dari volume kotak yang diberikan untuk ditanyakan.
Ukuran volume kotak yang diberikan untuk ditanyakan.
Berisi bagian dapat digunakan kembali dari parameter pencarian spasial.
Memberikan nilai
Sebuah array dari BaseParts yang cocok dengan pencarian spasial.
GetPartBoundsInRadius
WorldRoot:GetPartBoundsInRadius() kembali array bagian yang mana kotak pengikatnya tertumpang atas sebuah bidang yang volumenya dijelaskan menggunakan pusat yang diberikan ( Vector3 ) dan radius (number).
Seperti disoroti, metode pencarian spasial ini secara efisien mempertimbangkan volume kotak pengikat bagian daripada volume yang sebenarnya ditempati.Ini mungkin penting saat mempertimbangkan silinder, bola, serikat, dan MeshParts yang memiliki bentuk blok tidak.Untuk kasus di mana akurasi sangat penting, gunakan WorldRoot:GetPartsInPart() sebagai gantinya, atau filter lebih lanjut hasil metode ini sendiri.
Metode ini menggunakan objek untuk menggambarkan bagian yang dapat digunakan kembali dari pencarian spasial, seperti daftar pengecualian atau pengecualian, jumlah bagian maksimum untuk dipertanyakan, grup kolisi apa yang harus digunakan, dan apakah pencarian memfavoritkan nilai bagian yang tertumpang atas nilainya.
Parameter
Lokasi pusat dari volume bidang yang diberikan untuk ditanyakan.
Jari volume bola yang diberikan untuk ditanyakan.
Berisi bagian dapat digunakan kembali dari parameter pencarian spasial.
Memberikan nilai
Sebuah array dari BaseParts yang cocok dengan pencarian spasial.
GetPartsInPart
WorldRoot:GetPartsInPart() mengembalikan array bagian yang ruangnya dibagikan dengan bagian yang diberikan (yang harus ada di dalam WorldRoot seperti bagian yang akan dipertanyakan).Metode ini dapat digunakan sebagai pengganti BasePart:GetTouchingParts() dan umumnya merupakan pilihan yang lebih baik.
Seperti dicatat, metode pencarian spasial ini mempertimbangkan volume yang tepat yang ditempati oleh bagian yang diberikan menggunakan pemeriksaan kolisi geometris penuh.Sebagai contoh, bagian cekung/kosong tidak akan cocok dengan bagian yang ditanyakan di dalamnya kecuali jika mereka benar-benar tumpang tindih/menyentuh bagian seperti itu.Untuk volume yang lebih sederhana, pertimbangkan untuk menggunakan WorldRoot:GetPartBoundsInBox() atau WorldRoot:GetPartBoundsInRadius(), karena mereka kurang akurat tetapi berjalan lebih efisien.
Metode ini menggunakan objek untuk menggambarkan bagian yang dapat digunakan kembali dari pencarian spasial, seperti daftar pengecualian atau pengecualian, jumlah bagian maksimum untuk dipertanyakan, grup kolisi apa yang harus digunakan, dan apakah pencarian memfavoritkan nilai bagian yang tertumpang atas nilainya.
Parameter
Bagian yang volume nya harus diperiksa terhadap bagian lain.
Berisi bagian dapat digunakan kembali dari parameter pencarian spasial.
Memberikan nilai
Sebuah array dari BaseParts yang cocok dengan pencarian spasial.
IKMoveTo
Fungsi ini memindahkan bagian yang ditentukan ke lokasi yang ditentukan melalui kinematika terbalik daripada memindahkannya ke sana secara langsung, untuk memastikan setiap persyaratan, constraints , atau tabrakan yang bagian terlibat dalamnya tetap puas secara fisik.Saat ini fungsi ini hanya tersedia di Studio ke plugins , karena saat ini bertentangan dengan fisika gameyang berjalan.
Terjemahkan ketegangan adalah angka antara 0 dan 1 yang menentukan seberapa agresif untuk mencocokkan posisi bagian dengan posisi bagian target CFrame. Putar ketegangan adalah angka antara 0 dan 1 yang menentukan seberapa agresif untuk mencocokkan rotasi bagian dengan bagian rotasi target CFrame.
Sebagai contoh:
- Jika menerjemahkan ketegangan dan memutar ketegangan sama dengan 1, maka bagian akan dipindahkan persis ke CFrame target terlepas dari apa batasan fisik ada di atasnya.
- Jika ketegangan terjemahan dan ketegangan berputar sama dengan 0,5, maka bagian akan berusaha pindah ke persis CFrame target, tetapi mungkin dorong dari jalan oleh batasan fisik pada itu.
- Jika ketegangan terjemahan dan ketegangan berputar sama dengan 0, maka CFrame target akan diabaikan dan batasan fisik akan diselesaikan untuk objek di posisi di mana itu berada.
Parameter
Bagian yang dipindahkan.
Lokasi untuk memindahkan bagian yang ditentukan.
Angka antara 0 dan 1 menentukan seberapa agresif untuk mencocokkan posisi bagian dengan posisi bagian target CFrame .
Angka antara 0 dan 1 menentukan seberapa agresif untuk mencocokkan rotasi bagian dengan bagian rotasi target CFrame.
Memungkinkan Anda untuk menentukan objek apa yang harus dipengaruhi oleh resolusi fisik.
Memberikan nilai
Raycast
Melemparkan sinar menggunakan asal, arah, dan opsional RaycastParams .Jika menemukan sel yang memenuhi syarat BasePart atau Terrain , sel RaycastResult dikembalikan yang berisi hasil operasi.Jika tidak ada objek RaycastParams yang disediakan, default akan digunakan (semua bagian dianggap dan Terrain air tidak diabaikan).
Perhatikan bahwa panjang (besaran) vektor arah penting, karena objek/tanah lebih jauh dari panjangnya tidak akan diuji.Jika Anda menggunakan CFrame untuk membantu membuat komponen sinar, pertimbangkan untuk menggunakan CFrame.LookVector sebagai vektor arah dan kalikan dengan panjang yang diinginkan seperti yang ditunjukkan dalam contoh di bawah ini.Panjang maksimum vektor arah adalah 15.000 stud.
Metode ini tidak tidak menggunakan objek Ray , tetapi komponen asal dan arahnya dapat dipinjam dari Ray.Origin dan Ray.Direction .
Parameter
Titik asal ray.
Vektor arah dari sinar. Perhatikan bahwa panjang vektor ini penting, karena bagian/tanah yang lebih jauh dari panjangnya tidak akan diuji.
Sebuah objek yang digunakan untuk menentukan kelayakan pukul dalam operasi raycast.Jika tidak disediakan, nilai default digunakan di mana semua bagian dipertimbangkan dan Terrain air tidak diabaikan.
Memberikan nilai
Contoh Kode
Casts a ray and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castRay()
-- The origin point of the ray
local originPosition = Vector3.new(0, 50, 0)
-- The direction the ray is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the ray
local distance = 50
-- Cast the ray and create a visualization of it
local raycastResult = Workspace:Raycast(originPosition, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Ray intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between ray origin and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a ray every 2 seconds
while true do
castRay()
task.wait(2)
end
Shapecast
Parameter
Memberikan nilai
Spherecast
Memancarkan bentuk bola pada arah tertentu dan mengembalikan kolisi pertama dengan sel BasePart atau Terrain .Ini mirip dengan cara WorldRoot:Raycast() melemparkan sinar linier ke arah untuk menemukan kolisi, tetapi menggunakan bentuk 3D alih-alih sinar.
Tidak seperti WorldRoot:GetPartsInPart() , metode ini tidak mendeteksi BaseParts bahwa awalnya memotong bentuk.
Jika sebuah hit terdeteksi, RaycastResult dikembalikan yang berisi informasi hit.Properti Distance mewakili jarak yang harus ditempuh bentuk untuk menemukan hit, dan properti Position mewakili titik intersepsi yang menyebabkan hit.
Metode ini membuang kesalahan jika radius atau input arah tidak valid ditransmisikan.
Parameter
Posisi awal dari bentuk bola yang dilemparkan.
Radius dari bentuk bola yang dilemparkan dalam stud. Radius maksimum adalah 256 stud.
Arah dari shapecast, dengan magnitudo yang mewakili jarak maksimum yang dapat ditempuh bentuk. Jarak maksimum adalah 1024 stud.
Memberikan nilai
Contoh Kode
Casts a sphere and returns the first collision with a BasePart or Terrain. Prints the properties of the RaycastResult if a result was hit.
local Workspace = game:GetService("Workspace")
local function castSphere()
-- The initial position of the cast spherical shape
local originPosition = Vector3.new(0, 50, 0)
-- The radius of the cast spherical shape in studs
local radius = 10
-- The direction the sphere is cast in
local direction = -Vector3.yAxis
-- The maximum distance of the cast
local distance = 50
-- Cast the sphere and create a visualization of it
local raycastResult = Workspace:Spherecast(originPosition, radius, direction * distance)
if raycastResult then
-- Print all properties of the RaycastResult if it exists
print(`Sphere intersected with: {raycastResult.Instance:GetFullName()}`)
print(`Intersection position: {raycastResult.Position}`)
print(`Distance between sphere's initial position and result: {raycastResult.Distance}`)
print(`The normal vector of the intersected face: {raycastResult.Normal}`)
print(`Material hit: {raycastResult.Material.Name}`)
else
print("Nothing was hit")
end
end
-- Continually cast a sphere every 2 seconds
while true do
castSphere()
task.wait(2)
end
StepPhysics
Memajukan simulasi untuk bagian di dunia ke depan berdasarkan peningkatan waktu yang ditentukan dan satu set opsi BasePart .Ketika satu set bagian ditentukan, hanya bagian-bagian ini yang akan disimulasikan dan semua bagian lain di dunia akan diperlakukan sebagai terpasang.Saat argumen ini ditinggalkan, semua bagian di dunia akan dimasukkan dalam simulasi.Peningkatan waktu yang ditentukan dapat menjadi angka positif, dengan nilai yang lebih besar meningkatkan waktu eksekusi fungsi.Tergantung pada nilai peningkatan waktu, sistem fisika dapat membaginya menjadi beberapa langkah individu untuk menjaga akurasi dan stabilitas simulasi.Bahkan jika fungsi melakukan banyak substep, hasil simulasi hanya akan terlihat setelah fungsi selesai.Untuk menggambarkan langkah-langkah individu dari simulasi, fungsi dapat dipanggil sekali per RenderStep melalui acara RunService.RenderStepped.
Parameter
Jumlah waktu yang akan disimulasikan. Argumen ini harus menjadi angka positif. Nilai yang lebih besar akan meningkatkan runtime fungsi ini.
배열 opsional dari bagian yang akan disimulasikan. Set ini harus berisi instansi yang berjenis BasePart ; jenis lain akan diabaikan.
Memberikan nilai
Contoh Kode
Simulates the parts in the workspace for a fixed period of time by calling the StepPhysics function once per frame until a specified time has elaspsed.
local RunService = game:GetService("RunService")
-- Optional array of parts to simulate; otherwise all parts will be simulated
local partsToSimulate = {
workspace.Part,
}
local function simulateParts(duration)
local time = 0.0
local stepJob
stepJob = RunService.RenderStepped:Connect(function(dt)
if time + dt > duration then
dt = duration - time
end
workspace:StepPhysics(dt, partsToSimulate)
time = time + dt
if time >= duration then
stepJob:Disconnect()
end
end)
end
-- Simulate workspace parts for 5 seconds, stepping the parts once per frame
simulateParts(5.0)