Model
*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.
Model adalah objek kontainer, yang berarti mereka mengumpulkan objek bersama-sama. Mereka paling baik digunakan untuk menyimpan koleksi BaseParts dan memiliki beberapa fungsi yang memperpanjang kinerjanya.
Model dimaksudkan untuk mewakili geometri kumpulan. Jika kumpulan Anda tidak memiliki interpretasi geometri, misalnya, kumpulan Scripts , gunakan Folder alih-alih.
Model whose komponen bagiannya terikat bersama dengan join (sehingga mereka dapat bergerak atau dihancurkan melalui simulasi fisik) biasanya memiliki aturPrimaryPart , karena itu menentukan bagian mana dalam model yang pivot dan box bawah akan "ikuti" saat model bergerak. Model statis yang tetap di satu tempat tidak mendapat manfaat dari memiliki atur
Model memiliki berbagai aplikasi, termasuk karakter pemain Roblox. Mereka juga memiliki beberapa perilaku unik yang penting untuk diingat:
- Jika posisi bagian di sumbu Y menghantam nilai Workspace.FallenPartsDestroyHeight, dan itu adalah objek terakhir di dalam Model, model akan dihancurkan juga.
- Ketika digunakan di tempat dengan Workspace.StreamingEnabled tetap pada benar, nilai ModelStreamingMode mengontrol berbagai perilaku sekitar bagaimana model dan anak cucu di replikasi dan/atau dihapus dari klien. Selain itu, nilai Class.Model.LevelOfDetail|LevelOfDetail
Seperti dengan semua jenis Instance , fakta bahwa seorang ibu b
Contoh Kode
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
Tetapkan tingkat rincian pada model untuk pengalaman dengan streaming instans.
Mengontrol perilaku streaming model pada Models ketika mode instans Streaming diaktifkan.
Bagian utama dari Model , atau nil jika tidak secara eksplisit atur.
Properti hanya editor digunakan untuk menyesuaikan model di sekitar pivotnya. Mengatur properti ini akan menghubungkan skala seperti Model/ScaleTo yang dipanggil di atasnya.
Menentukan di mana pivot dari Model yang tidak memiliki set Model.PrimaryPart berlokasi.
Metode
Tetapkan model ini menjadi persisten untuk pemain yang ditentukan. Model.ModelStreamingMode harus diatur menjadi PersistenPerPemain untuk perilaku berubah sebagai hasil tambahan.
Mengembalikan deskripsi volume yang berisi semua bagian dari Model.
Mengembalikan ukuran kotak pembatas terkecil yang berisi semua BaseParts dalam Model, diatur dengan Model.PrimaryPart jika diatur.
Mengembalikan semua objek Player yang bertahan untuk model objek ini. Perilaku bervariasi tergantung pada apakah metode ini dianggap dari Script atau LocalScript .
Mengembalikan skala kanonik model, yang default ke 1 untuk model baru yang dibuat dan akan berubah saat skalanya melalui Model/ScaleTo .
Pindahkan PrimaryPart ke posisi yang diberikan. Jika bagian utama tidak ditentukan, bagian akar model akan digunakan.
Membuat model ini tidak lagi bertahan untuk pemain tertentu. Model.ModelStreamingMode harus diatur menjadi PersistentPerPlayer untuk perilaku berubah sebagai hasil dari penghapusan.
Tetapkan skala faktor model, menyesuaikan ukuran dan lokasi semua Instans yang turun sehingga mereka memiliki skala faktor relatif terhadap ukuran dan lokasi awal mereka ketika skala faktor adalah 1.
Bergeser sebuah Model olehOffset yang diberikan Vector3 , menjaga orientasi model. Jika BasePart atau 1> Class.Terrain1> sudah ada di posisi baru maka 4> Class.Model4> akan menggeser objek yang dikatakan.
Mendapatkan pivot dari Class.PVInstance .
Mengubah PVInstance bersama dengan semua anaknya PVInstances sehingga pivot sekarang berada di CFrame yang ditentukan.
Properti
LevelOfDetail
Tetapkan tingkat rincian pada model untuk pengalaman dengan instance streaming yang diaktifkan.
Ketika diatur ke StreamingMesh, rendah resolusi "imposter" mesh (berwarna, coarse mesh yang menggulung di sekitar semua bagian anak model) menyajikan di luar radius streaming.
Ketika diatur ke Disabled atau Automatic, rendahnya resolusi meshes tidak akan ditampilkan.
ModelStreamingMode
Mengontrol cara Models diterjemahkan masuk dan keluar saat streaming diaktifkan. Perilaku bergantung pada枚um yang dipilih. Tidak ada efek saat streaming tidak diaktifkan.
Properti ini hanya boleh diubah di Studio melalui jendela Proprietas ketika streaming diaktifkan, atau di Scripts , tetapi tidak pernah di LocalScripts (melakukannya dapat mengakibatkan perilaku yang tidak diatur).
PrimaryPart
Mengacu pada bagian utama dari Model . Bagian utama adalah BasePart yang bertindak sebagai referensi fisik untuk pivot model. Artinya, ketika bagian dalam model diangkat karena simulasi fisik atau alat lainnya, pivot akan bergerak sinkron dengan bagian utama.
Catat bahwa Models tidak memiliki PrimaryPart yang diatur secara default. Jika Anda menciptakan model yang perlu diaktifkan oleh fisika, Anda harus secara manual menetapkan propperti ini di Studio atau dalam naskah. Jika bagian utama tidak diatur, pivot akan tetap berada di lokasi yang sama di ruang dunia, bahkan
Catat juga bahwa ketika menetapkan property ini, itu harus menjadi BasePart yang merupakan cucu dari model. Jika Anda mencoba menetapkan
Aturan umum untuk model adalah bahwa:
- Model whose parts are joined together via physical joints seperti WeldConstraints atau Motor6Ds harus memiliki bagian utama yang ditetapkan. Misalnya, model karakter Roblox memiliki Model.PrimaryPart set ke 1> HumanoidRootPart1> oleh default.
- Model statis ( biasanya Anchored ) yang tetap berada di satu tempat kecuali jika skrip secara eksplisit menggerakkan mereka tidak memerlukan Model.PrimaryPart dan cenderung tidak mendapat manfaat dari memiliki satu atur.
Contoh Kode
-- 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 property ini di pane sifat akan menyesuaikan model seperti jika Model/ScaleTo dianggil, menyesuaikan semua Instans turunan di model sehingga model memiliki skala faktor relatif terhadap ukuran aslinya.
Properti ini hanya tersedia di Studio dan akan menghasilkan kesalahan jika digunakan dalam Script atau LocalScript . Model/ScaleTo dan 1> Model/GetScale1> harus digunakan dari script.
WorldPivot
Properti ini menentukan di mana pivot dari Model yang tidak memiliki set Model.PrimaryPart adalah ber
Untuk Model yang baru saja dibuat, pivot-nya akan diperlakukan sebagai pusat dari kotak batas kontennya sampai pertama kali properti Model.WorldPivot-nya atur. Setelah pivot pertama kali ditetapkan, tidak mungkin untuk mengembalikan perilaku ini.
Paling umum, menggerakkan model dengan alat Studio, atau dengan fungsi gerakan model seperti PVInstance:PivotTo() dan Model:MoveTo(), akan menetapkan pivot dunia dan akhirnya mengakhiri perilaku model baru ini.
Tujuan dari perilaku ini adalah untuk memungkinkan kode Lua untuk mendapatkan pivot yang masuk akal hanya dengan menciptakan model baru dan menyetel objek ke dalamnya, menghindari perlu secara eksplisit menetapkan Model.WorldPivot setiap kali Anda membuat model di kode.
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
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
GetBoundingBox
Fungsi ini mengembalikan deskripsi dari volume yang mengandung semua anak BasePart dalam satu Model . Orientasi volume didasarkan pada orientasi dari
Jika tidak ada PrimaryPart untuk model, kotak batas akan diatur ke sumbu dunia.
local model = workspace.Modellocal part = workspace.Partlocal orientation, size = model:GetBoundingBox()-- Ubah dan posisikan bagian sama dengan kotak pembatas modelpart.Size = sizepart.CFrame = orientation
Memberikan nilai
GetExtentsSize
Mengembalikan ukuran kotak pembatas terkecil yang berisi semua BaseParts dalam Model . Jika Model.PrimaryPart ada maka kotak pembatas akan diatur ke bag
Catat fungsi ini hanya mengembalikan ukuran kotak pembatas terkecil, dan pengembang harus menggunakan metode mereka sendiri untuk mendapatkan posisi kotak pembatas.
Memberikan nilai
Contoh Kode
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 dianggil dari Script , itu mengembalikan semua objek Player yang bertahan untuk model ini. Saat dianggil dari LocalScript, metode ini hanya memeriksa apakah model ini bertahan untuk 1> Class.Players.LocalPlayer|LocalPlayer1> .
Memberikan nilai
Tabel dengan semua objek Player yang objek model ini bertahan.
GetScale
Model berisi skala skala persisten, yang dimulai dengan 1 untuk model baru yang dibuat dan perubahan saat model dibuat dengan menelepon Model/ScaleTo . Fungsi ini mengembalikan skala skala persisten model saat ini.
Faktor skala saat ini tidak langsung mempengaruhi ukuran Instans di bawah model. Ini digunakan untuk tujuan menulis dan mengekspor konten untuk menyimpan bagaimana model telah skal relatif terhadap ukurannya yang asli.
Dalam sesi yang diberikan, model akan menyimpan informasi ukuran asli yang tepat dari Instance descendant setelah panggilan pertama Model/ScaleTo . Ini berarti bahwa memanggil ScaleTo(x) setelah pangg
Faktor skala menghasilkan perilaku mesin secara satu cara: Faktor skala model akan diterapkan ke kompensasi bersama dari animations yang dimainkan di AnimationController di bawah model itu, sehingga animasi bermain animasi akan benar-benar bermain kembali bahkan ketika skala.
Memberikan nilai
Faktor skala kanonik saat ini dari model.
Contoh Kode
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 ditentukan. Jika bagian utama belum ditentukan, bagian akar model akan digunakan, tetapi bagian utama tidak deterministik dan direkomendasikan agar Anda selalu menetapkan bagian utama saat menggunakan MoveTo() .
Jika ada penghalang di mana model harus dipindahkan, seperti Terrain atau BaseParts, model akan dipindahkan secara vertikal ke atas sampai tidak ada yang menghalangi. Jika perilaku ini tidak diinginkan, PVInstance:PivotTo() harus digunakan.
Catat bahwa rotasi tidak dipertahankan saat mengubah model dengan MoveTo() . Diperlukan untuk menggunakan salah satu TranslateBy() atau PVInstance:PivotTo() jika rotasi saat ini model perlu dipertahankan.
Parameter
Memberikan nilai
Contoh Kode
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)
ScaleTo
Model berisi skala skala persisten, yang dimulai dengan 1 untuk model baru yang dibuat. Fungsi ini menyesuaikan model, di sekitar lokasi pivot, relatif terhadap bagaimana akan terlihat pada skala faktor 1. Untuk melakukan ini, melakukan dua hal:
- Tetapkan skala faktor saat ini model ke nilai yang ditentukan
- Mengubah dan menempatkan ulang semua Instans yang turun sesuai
Skalierung lokasi dilakukan di sekitar lokasi pivot.
Semua "geometrik" properti dari Instans turunan akan d skalakan. Itu jelas mencakup ukuran bagian, tetapi ini adalah beberapa contoh lain dari properti yang d skalakan:
- Ujung panjang dari join seperti WeldConstraints dan Class.Rope|Ropes
- Kecepatan dan kekuatan fisik seperti Hinge.MaxServoTorque
- Proporsi visual seperti ukuran emitter partikel
- Prop panjang lainnya seperti Sound.RollOffMinDistance
Parameter
Memberikan nilai
TranslateBy
Bergeser sebuah Model olehOffset yang diberikan Vector3 , menjaga orientasi model. Jika BasePart atau 1> Class.Terrain1> sudah ada di posisi baru maka 4> Class.Model4> akan menggeser objek yang dikatakan.
Terjemahan diterapkan di ruang dunia daripada ruang objek, yang berarti bahkan jika bagian model diberi orientasi secara berbeda, itu masih akan bergerak di sumbu standar.
Parameter
Memberikan nilai
Contoh Kode
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)