Melalui prompt teks dan skema preset, Anda (dan pemain dalam permainan) dapat menghasilkan aset 3D statis dan model fungsional sepenuhnya seperti kendaraan yang dapat dikendarai, pesawat terbang, dan senjata yang dapat menembak. Panduan ini menunjukkan cara menggunakan GenerateModelAsync() sebagai bagian dari pengalaman kreatif yang dinamis dan dipimpin pemain.
Ikhtisar
GenerateModelAsync() memungkinkan generasi geometri multi-mesh dengan keuntungan sebagai berikut:
- Skema yang diberikan mendefinisikan bagaimana geometri yang dihasilkan akan dibagi menjadi bagian.
- Setiap objek yang dihasilkan dalam permainan akan direplikasi dan terlihat oleh semua pemain, memungkinkan mereka untuk membangun bersama secara waktu nyata.
- Mesh yang dihasilkan memiliki fidelitas yang lebih tinggi dengan bentuk, siluet, detail yang lebih baik, dan artefak yang lebih sedikit. Tekstur yang dihasilkan lebih koheren dan detail, dengan lebih sedikit kekasaran dan pencahayaan yang kurang terlihat.
- Waktu generasi memiliki latensi yang lebih rendah, memungkinkan penciptaan yang lebih cepat dan responsif dalam permainan.
- Anda bahkan bisa meminta pemain selama waktu bermain untuk menentukan batasan ukuran untuk menyarankan ukuran dan proporsi model yang dihasilkan.
- Jumlah segitiga maksimum opsional menjaga objek yang dihasilkan tetap optimal untuk permainan Anda.
Generasi berbasis skema
Untuk membuat objek yang dapat digerakkan dan fungsional, geometri yang dihasilkan harus dipisahkan ke dalam beberapa MeshParts. Sebagai contoh, untuk membuat mobil yang dapat dikendarai dengan roda yang berputar dan dapat diputar, setidaknya diperlukan lima MeshParts: satu untuk bodi mobil dan empat untuk setiap roda mobil. GenerateModelAsync() mencapainya melalui sebuah skema yang mencantumkan bagian yang akan dihasilkan, seperti yang ditunjukkan dalam potongan kode berikut:
Script in ServerScriptService
local GenerationService = game:GetService("GenerationService")
local Workspace = game:GetService("Workspace")
-- Siapkan input untuk geometri yang dihasilkan
local inputs = {
TextPrompt = "mobil naga hijau dengan 4 roda"
}
-- Tetapkan skema ke sasis mobil lima-model yang telah ditentukan
local schema = {
PredefinedSchema = "Car5"
}
-- Lakukan panggilan untuk menghasilkan model
local success, result, metadata = pcall(function()
return GenerationService:GenerateModelAsync(inputs, schema)
end)
if success then
-- Skala model ke ukuran target dan posisikan dekat pusat dunia
local targetSize = 16
local modelSize = result:GetExtentsSize()
local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)
result:ScaleTo(scaleFactor)
result:PivotTo(CFrame.new(0, result:GetExtentsSize().Y / 2, -40))
-- Jamin semua bagian agar mesh tidak terpisah
for _, descendant in result:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.Anchored = true
end
end
-- Beri nama model dan parent ke workspace
result.Name = "BasicDragonCarGeneration"
result.Parent = Workspace
else
warn(result)
end
Gambar berikut menunjukkan keluaran yang diharapkan dan konstruksinya seperti yang terlihat dalam hirarki Explorer:


Skrip yang dapat ditargetkan ulang
Di Roblox, perilaku biasanya mencakup skrip, lampiran, kendala, dan jenis instance lain yang terpasang pada geometri bertekstur statis untuk membuatnya fungsional. Karena GenerateModelAsync() menghasilkan berbagai geometri secara instan, maka skrip yang dapat ditargetkan ulang harus terpasang untuk secara otomatis menyesuaikan perilaku dengan fungsionalitas yang diharapkan.
Sebagai contoh, pertimbangkan sebuah permainan di mana pemain bisa membuat mobil yang bisa dikendarai sendiri. GenerateModelAsync() mengambil prompt pemain dan menghasilkan lima mesh yang berbeda (bodi dan empat roda) melalui skema Car5. Kemudian, skrip yang sudah ditentukan dijadikan panduan untuk mengadaptasi perilaku berkendara sesuai dengan ukuran dan bentuk model untuk memastikan mobil tersebut dapat dikendarai dan roda-rodanya berputar secara realistis.
Untuk menguji skrip yang dapat ditargetkan ulang:
Unduh file Behaviors.rbxm.
Dalam hirarki Explorer Studio, klik kanan ReplicatedStorage, pilih Insert ⟩ Import Roblox Model, dan pilih file yang diunduh. Model akan dipecah menjadi beberapa folder.

Salin dan tempel salah satu potongan kode berikut ke dalam Script server dalam ServerScriptService, tergantung pada jenis objek yang ingin Anda hasilkan.
Contoh ini menghasilkan mobil fungsional dengan rem, dorongan nitro, efek audio dan visual, dan indikator kecepatan di layar.
Script in ServerScriptServicelocal GenerationService = game:GetService("GenerationService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local Workspace = game:GetService("Workspace")-- Siapkan input untuk geometri yang dihasilkanlocal inputs = {TextPrompt = "mobil naga hijau dengan 4 roda"}-- Tetapkan skema ke sasis mobil lima-model yang telah ditentukanlocal schema = {PredefinedSchema = "Car5"}-- Lakukan panggilan untuk menghasilkan modellocal success, result, metadata = pcall(function()return GenerationService:GenerateModelAsync(inputs, schema)end)if success then-- Skala model ke ukuran targetlocal targetSize = 16local modelSize = result:GetExtentsSize()local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)result:ScaleTo(scaleFactor)-- Muat modul "makeFunctional" untuk "CarBehavior"local makeFunctional = require(ReplicatedStorage.Behaviors.CarBehavior.makeFunctional)-- Referensi bagian mobil dengan nama yang dijamin melalui skema "Car5"local body = result:FindFirstChild("bodhi")local frontLeftWheel = result:FindFirstChild("roda depan kiri")local frontRightWheel = result:FindFirstChild("roda depan kanan")local rearLeftWheel = result:FindFirstChild("roda belakang kiri")local rearRightWheel = result:FindFirstChild("roda belakang kanan")-- Setel parameter konfigurasi perilakulocal config = {seatPosition = "di dalam",invisibleWhenSeated = false}-- Pasang perilaku melalui skrip "makeFunctional"local functionalModel = makeFunctional(result, frontLeftWheel, frontRightWheel, rearLeftWheel, rearRightWheel, body, config)-- Posisikan model dekat pusat duniafunctionalModel:PivotTo(CFrame.new(0, functionalModel:GetExtentsSize().Y / 2, -40))functionalModel.Name = "BasicDragonCarGeneration"functionalModel.Parent = Workspaceelsewarn(result)end