Model
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Model adalah objek wadah, artinya mereka mengumpulkan objek bersama-sama.Mereka paling baik digunakan untuk menyimpan koleksi BaseParts dan memiliki beberapa fungsi yang memperluas fungsionalitas mereka.
Model dimaksudkan untuk mewakili kelompok geometris .Jika klasifikasi Anda tidak memiliki interpretasi geometris, misalnya koleksi Scripts , gunakan Folder sebagai gantinya.
Model yang bagian konstituennya bergabung bersama dengan persambungan (sehingga mereka dapat bergerak atau dihancurkan melalui simulasi fisika) biasanya memiliki set PrimaryPart , karena menentukan bagian mana dalam model pivot dan kotak pengikat akan "ikuti" saat model bergerak.Model statis yang tetap di satu tempat tidak mendapat manfaat dari memiliki set bagian utama.
Model memiliki berbagai aplikasi, termasuk karakter pemain Roblox.Mereka juga memiliki beberapa perilaku unik yang penting untuk diingat:
- Ketika Humanoid dan Part berjudul Kepala diposisikan di bawah model, GUI nama/kesehatan akan muncul di atas model; lihat Nama Karakter/Tampilan Kesehatan untuk rincian.
- Jika posisi bagian di sumbu Y memukul nilai Workspace.FallenPartsDestroyHeight , dan itu adalah objek terakhir di dalam Model , model akan hancur juga.
- Ketika digunakan di tempat dengan Workspace.StreamingEnabled diatur ke benar, nilai ModelStreamingMode mengontrol berbagai perilaku di sekitar bagaimana model dan keturunan mana pun direplikasi dan/atau dihapus dari klien.Selain itu, nilai LevelOfDetail mempengaruhi rendering model.
Seperti semua jenis Instance tipe, kenyataan bahwa seorang orang tua Model direplikasi ke klien tidak menjamin bahwa semua anaknya direplikasi.Ini sangat penting jika instans ini diakses oleh kode yang dijalankan di klien, seperti di dalam LocalScript .Menggunakan ModelStreamingMode dengan nilai seperti Atomic dapat memastikan seluruh model dan semua keturunannya hadir jika model orangtua ada di klien, atau Anda dapat menggunakan WaitForChild() ketika atomisitas tidak diinginkan.
Contoh Kode
The following sample includes a basic function that takes a table of objects and parents them into a new Model, returning that Model.
local function groupObjects(objectTable)
local model = Instance.new("Model")
for _, object in pairs(objectTable) do
object.Parent = model
end
return model
end
local objects = {
Instance.new("Part"),
Instance.new("Part"),
}
groupObjects(objects)
Rangkuman
Properti
Mengatur 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
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
LevelOfDetail
Mengatur tingkat rincian pada model untuk pengalaman dengan instansi streaming diaktifkan.
Ketika diatur ke StreamingMesh , jaring "imposter" dengan resolusi lebih rendah (berwarna, jaring kasar yang melingkupi semua bagian anak model) ditampilkan di luar radius streaming.
Ketika diatur ke Disabled atau Automatic , meshes resolusi lebih rendah tidak akan ditampilkan.
ModelStreamingMode
Mengontrol bagaimana Models diputar masuk dan keluar saat instansi streaming diaktifkan.Perilaku tergantung pada enum yang dipilih.Tidak memiliki efek ketika streaming tidak diaktifkan.
Properti ini hanya boleh diubah di Studio melalui jendela Properti saat streaming diaktifkan, atau di Scripts , tetapi tidak pernah di LocalScripts (melakukannya dapat menyebabkan perilaku tidak didefinisikan).
PrimaryPart
Menunjuk ke bagian utama dari Model .Bagian utama adalah BasePart yang bertindak sebagai referensi fisik untuk pivot model.Artinya, ketika bagian dalam model dipindahkan karena simulasi fisik atau cara lain, pivot akan bergerak sinkron dengan bagian utama.
Perhatikan bahwa Models tidak memiliki PrimaryPart diatur secara default.Jika Anda membuat model yang perlu ditindaklanjuti oleh fisika, Anda harus secara manual mengatur properti ini di Studio atau dalam skrip.Jika bagian utama adalah tidak diatur, pivot akan tetap berada di lokasi yang sama di ruang dunia, bahkan jika bagian dalam model dipindahkan.
Perhatikan juga bahwa saat mengatur properti ini, itu harus menjadi BasePart yang merupakan keturunan model.Jika Anda mencoba untuk mengatur Model.PrimaryPart ke BasePart yang merupakan bukan keturunan model, itu akan disetel ke bagian itu tetapi direset ke nil selama langkah simulasi berikutnya — ini adalah perilaku lama untuk mendukung skrip yang berasumsi mereka dapat sementara menetapkan bagian utama ke BasePart yang bukan keturunan model.
Aturan umum untuk model adalah bahwa:
- Model yang bagiannya dihubungkan bersama melalui persambungan fisik seperti WeldConstraints atau Motor6Ds harus memiliki bagian utama yang ditugaskan.Sebagai contoh, model karakter Roblox memiliki set Model.PrimaryPart ke HumanoidRootPart secara default.
- Model statis (biasanya Anchored ) yang tetap di satu tempat kecuali skrip secara eksplisit memindahkannya tidak memerlukan Model.PrimaryPart dan cenderung tidak mendapat manfaat dari memiliki satu set
Contoh Kode
This code sample creates and throws a dice model, then outputs whether it landed with the blue side facing up. If Model.PrimaryPart was not set, the pivot / bounding box of the dice would rotate, as the parts inside of it are physically simulated during the roll.
-- Create a dice model with two halves and attach them together
local diceModel = Instance.new("Model")
diceModel.Name = "ChanceCube"
local diceTop = Instance.new("Part")
diceTop.Size = Vector3.new(4, 2, 4)
diceTop.Position = Vector3.new(0, 1, 0)
diceTop.Color = Color3.new(0, 0, 1)
diceTop.Parent = diceModel
local diceBottom = diceTop:Clone()
diceBottom.Position = Vector3.new(0, -1, 0)
diceBottom.Color = Color3.new(1, 0, 0)
diceBottom.Parent = diceModel
local weld = Instance.new("WeldConstraint")
weld.Part0 = diceTop
weld.Part1 = diceBottom
weld.Parent = diceModel
-- Put the dice up in the air above the workspace origin (does not require a primary part)
diceModel.Parent = workspace
diceModel:PivotTo(CFrame.new(0, 10, 0))
-- Assign the primary part before physical simulation
-- Without this line, the script will always output the same thing and the bounding box of the model will not change orientation
diceModel.PrimaryPart = diceTop
-- Wait a bit before rolling the dice (let it settle onto the floor)
for i = 5, 1, -1 do
print("Rolling dice in...", i)
task.wait(1)
end
diceTop:ApplyAngularImpulse(Vector3.new(15000, 1000, 5000))
diceTop:ApplyImpulse(Vector3.new(0, 3000, 0))
task.wait(1)
-- Wait for the roll to complete
while diceTop.AssemblyLinearVelocity.Magnitude > 0.1 or diceTop.AssemblyAngularVelocity.Magnitude > 0.1 do
task.wait()
end
-- Get the dice orientation, impacted by the primary part
local orientation = diceModel:GetBoundingBox()
if orientation.YVector.Y > 0.5 then
print("It's the boy!")
else
print("It's his mother!")
end
Scale
Mengatur properti ini di jendela Properti akan memperluas model seolah-olah Model/ScaleTo dipanggil di atasnya, memperluas semua Instans turunan dalam model, seperti materi, gambar, dan geometri 3D bagian, sehingga model memiliki faktor skala yang ditentukan relatif terhadap ukuran aslinya.
Properti ini hanya tersedia di Studio dan akan menyebabkan kesalahan jika digunakan di Script atau LocalScript .Model/ScaleTo dan Model/GetScale harus digunakan dari skrip.
WorldPivot
Properti ini menentukan di mana titik pivot dari yang tidak memiliki set tidak terletak.Jika Model melakukan memiliki PrimaryPart , titik pivot dari Model adalah sama dengan titik pivot dari bagian utama itu, dan properti ini WorldPivot diabaikan.
Untuk baru dibuat Model , pivotnya akan diperlakukan sebagai pusat kotak batas isinya sampai pertama kali properti Model.WorldPivot diatur.Setelah pivot dunia ditetapkan untuk pertama kalinya, tidak mungkin untuk memulihkan perilaku awal ini.
Umumnya, pindahkan model dengan alat Studio, atau dengan fungsi gerakan model seperti PVInstance:PivotTo() dan Model:MoveTo(), akan mengatur pivot dunia dan dengan demikian mengakhiri perilaku model baru ini.
Tujuan perilaku ini adalah untuk memungkinkan kode Luau mendapatkan pivot yang masuk akal hanya dengan membuat model baru dan objek orang tua kepadanya, menghindari kebutuhan untuk secara eksplisit mengatur setiap kali Anda membuat model dalam kode.
local Workspace = game:GetService("Workspace")local model = Instance.new("Model")Workspace.BluePart.Parent = modelWorkspace.RedPart.Parent = modelmodel.Parent = Workspaceprint(model:GetPivot()) -- Currently equal to the center of the bounding box containing "BluePart" and "RedPart"model:PivotTo(CFrame.new(0, 10, 0)) -- This works without needing to explicitly set "model.WorldPivot"
Contoh Kode
This code sample shows a custom function for resetting the pivot of a model back to the center of that model's bounding box.
local function resetPivot(model)
local boundsCFrame = model:GetBoundingBox()
if model.PrimaryPart then
model.PrimaryPart.PivotOffset = model.PrimaryPart.CFrame:ToObjectSpace(boundsCFrame)
else
model.WorldPivot = boundsCFrame
end
end
resetPivot(script.Parent)
Metode
AddPersistentPlayer
Atur model ini menjadi permanen untuk pemain yang ditentukan.Model permanen tetap hadir untuk pemain terlepas dari pengaturan atau kondisi streaming.
ModelStreamingMode harus diatur ke PersistentPerPlayer agar perilaku berubah sebagai hasil dari tambahan.
Parameter
Memberikan nilai
GetBoundingBox
Fungsi ini men返ikan deskripsi volume yang berisi semua anak BasePart dalam sebuah Model .Orientasi volume didasarkan pada orientasi PrimaryPart , dan cocok dengan kotak pilihan yang ditampilkan di Studio saat model dipilih.Mencerminkan perilaku Terrain:FillBlock() , ia mem返回kan CFrame yang mewakili pusat kotak pengikat itu dan Vector3 yang mewakili ukurannya.
Jika tidak ada PrimaryPart untuk model, kotak batas akan disesuaikan dengan sumbu dunia.
local Workspace = game:GetService("Workspace")local model = Workspace.Modellocal part = Workspace.Partlocal orientation, size = model:GetBoundingBox()-- Ubah ukuran dan posisi bagian sama dengan kotak batas modelpart.Size = sizepart.CFrame = orientation
Memberikan nilai
GetExtentsSize
Kembalikan ukuran kotak batas terkecil yang berisi semua BaseParts di Model.Jika Model.PrimaryPart ada maka kotak batas akan disesuaikan dengan bagian itu.Jika bagian utama belum ditetapkan maka fungsi akan memilih bagian di model untuk menyesuaikan kotak batas untuk.Karena pemilihan bagian ini tidak deterministik, disarankan untuk mengatur Model.PrimaryPart untuk mendapatkan hasil konsisten dengan fungsi ini.
Perhatikan fungsi ini hanya mengembalikan ukuran kotak batas terkecil, dan pengembang harus menggunakan metode mereka sendiri untuk mendapatkan posisi kotak batas.
Memberikan nilai
Contoh Kode
The code sample below demonstrates how Model.GetExtentsSize can be used to get the size of the bounding box containing the parts.
local model = Instance.new("Model")
model.Parent = workspace
local RNG = Random.new()
for _ = 1, 5 do
local part = Instance.new("Part")
part.Anchored = true
part.Size = Vector3.new(RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5))
part.Parent = model
end
print(model:GetExtentsSize())
GetPersistentPlayers
Ketika metode ini dipanggil dari Script , ia mengembalikan semua objek Player yang persisten untuk model ini.Ketika dipanggil dari LocalScript , metode ini hanya memeriksa apakah model ini bertahan untuk LocalPlayer .
Memberikan nilai
Meja dengan semua objek Player yang persisten untuk objek model ini.
GetScale
Model berisi faktor skala kanonik permanen, yang dimulai dari 1 untuk model yang baru dibuat dan berubah saat model diubah dengan memanggil Model/ScaleTo.Fungsi ini mengembalikan faktor skala kanonik saat ini dari model.
Faktor skala saat ini tidak langsung mempengaruhi ukuran Instans di bawah model.Ini digunakan untuk tujuan penulisan konten dan skrip untuk mengingat bagaimana model telah diskalakan relatif terhadap ukuran aslinya.
Dalam sesi tertentu, model akan menyimpan informasi ukuran asli yang tepat dari Instans turunan setelah panggilan pertama Model/ScaleTo .Ini berarti bahwa memanggil ScaleTo(x) diikuti oleh ScaleTo(1) akan membawa Anda kembali persis konfigurasi asli model tanpa mengambangkan titik apa pun.Menghindari drift titik mengambang adalah motivasi untuk memiliki fungsi Skala Untuk fungsi Skala oleh fungsi.
Faktor skala mempengaruhi perilaku mesin dalam satu cara: Faktor skala model akan diterapkan ke offset bersama dari dimainkan di bawah model itu, sehingga animasi bergerak akan dimainkan dengan benar bahkan saat diperkecil.
Memberikan nilai
Faktor skala kanonik saat ini dari model.
Contoh Kode
This code sample demonstrates substituting in a replacement for all the copies of a tree model using PivotTo and ScaleTo. The pivot and scale of the models are used as a reference ensuring that the relative sizes and locations of the replacement models match those of the originals.
local CollectionService = game:GetService("CollectionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Find all the models with the tag we want to replace
local items = CollectionService:GetTagged("Tree")
local newModel = ReplicatedStorage.FancyTreeReplacementModel
for _, item in items do
-- Make the new item and scale / position it where the old one was
local newItem = newModel:Clone()
newItem:ScaleTo(item:GetScale())
newItem:PivotTo(item:GetPivot())
-- Add the same tag to the replacement
CollectionService:AddTag(newItem, "Tree")
-- Delete the old item and parent the new one
newItem.Parent = item.Parent
item:Destroy()
end
MoveTo
Pindahkan PrimaryPart ke posisi yang diberikan.Jika bagian utama tidak ditentukan, bagian akar model akan digunakan, tetapi bagian akar tidak deterministik dan disarankan agar Anda selalu menetapkan bagian utama saat menggunakan MoveTo() .
Jika ada hambatan di mana model harus dipindahkan, seperti Terrain atau lainnya BaseParts, model akan dipindahkan secara vertikal ke atas sampai tidak ada apa-apa di jalan.Jika perilaku ini tidak diinginkan, PVInstance:PivotTo() harus digunakan sebagai gantinya.
Perhatikan bahwa rotasi tidak dipertahankan saat memindahkan model dengan MoveTo() .Disarankan untuk menggunakan TranslateBy() atau PVInstance:PivotTo() jika rotasi model saat ini perlu dipertahankan.
Parameter
Memberikan nilai
Contoh Kode
This sample demonstrates how Model:MoveTo avoids collisions.
A simple two part Model is created, and its PrimaryPart is set. An large obstruction part is placed next to it.
After 5 seconds Model:MoveTo is used to direct the model to move inside the obstruction part. However, as MoveTo will not move a model inside of an obstruction the Model is moved up on the Y axis and placed above the obstruction.
local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
model.Parent = workspace
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.Position = START_POSITION
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.Position = START_POSITION + Vector3.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
model:MoveTo(END_POSITION)
RemovePersistentPlayer
Membuat model ini tidak lagi permanen untuk pemain yang ditentukan.Ini tidak menjamin model akan segera dihapus untuk pemain; setelah memanggil metode ini, model akan diperlakukan sebagai Atomic untuk pemain itu dan akan tetap ada selama berada dalam radius streaming target.
ModelStreamingMode harus diatur ke PersistentPerPlayer agar perilaku berubah sebagai hasil dari penghapusan.
Parameter
Memberikan nilai
ScaleTo
Model berisi faktor skala kanonik permanen, yang dimulai dari 1 untuk model baru yang dibuat.Fungsi ini membesarkan model, di sekitar lokasi pivot, relatif terhadap bagaimana ia akan melihat faktor skala 1.Untuk mencapai ini, ia melakukan dua hal:
- Atur faktor skala saat ini dari model ke nilai yang ditentukan
- Mengubah ukuran dan posisi kembali semua Instans anak sesuai
Skalierung lokasi dilakukan di sekitar lokasi pivot.
Semua properti "geometris" dari Instans anak akan diukur.Itu jelas termasuk ukuran bagian, tetapi di sini ada beberapa contoh properti yang diukur:
- Panjang persambungan seperti WeldConstraints , dan Class.Rope|Ropes
- Kecepatan fisik dan gaya seperti Hinge.MaxServoTorque
- Properti visual seperti ukuran emitor partikel
- Properti panjang lain seperti Sound.RollOffMinDistance
Parameter
Memberikan nilai
TranslateBy
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.
Terjemahan diterapkan di ruang dunia daripada ruang objek, artinya bahkan jika bagian model berorientasi berbeda akan tetap bergerak di sepanjang sumbu standar.
Parameter
Memberikan nilai
Contoh Kode
This sample demonstrates how Model:TranslateBy ignores collisions and respects the orientation of the model.
A simple two part Model is created, rotated 45 degrees on the Y axis, and its PrimaryPart is set. An large obstruction part is placed next to it.
After 5 seconds Model:TranslateBy is used to direct the model to move inside the obstruction part. The model will move inside of the obstruction and maintain it's current orientation.
local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.CFrame = CFrame.new(START_POSITION) * CFrame.Angles(0, math.rad(45), 0)
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.CFrame = part1.CFrame * CFrame.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Transparency = 0.5
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
-- use TranslateBy to shift the model into the obstruction
model:TranslateBy(END_POSITION - START_POSITION)