透過文字提示和預設架構,您(以及遊戲中的玩家)可以生成靜態 3D 資產和 完全功能 的模型,例如可以行駛的車輛、飛行的飛機和射擊的武器。本指南演示了如何使用 GenerateModelAsync() 作為動態的玩家驅動創意體驗的一部分。
概述
GenerateModelAsync() 能夠生成多網格幾何,具有以下優勢:
- 提供的 架構 定義了生成的幾何如何被分割成不同的部分。
- 在遊戲中生成的任何物件將被複製並對所有玩家可見,允許他們實時共同構建。
- 生成的網格具有更高的真實感,整體形狀、輪廓、細節更豐富,且瑕疵更少。生成的材質更為一致和細緻,顆粒感更低,內建的照明效果不那麼明顯。
- 生成時間的延遲更低,使得在遊戲中能更快速、更靈敏地創建。
- 您甚至在遊戲時間中也可以指定邊界框,以建議生成模型的大小和比例。
- 可選的最大三角形數量保持生成物件在您的遊戲中高效運行。
基於架構的生成
要創建可動的功能性物件,生成的幾何必須分成多個 MeshParts。例如,要創建一輛可駕駛的汽車,汽車的車輪必須能夠旋轉和轉向,至少需要五個 MeshParts:一個用於車身,四個用於每個車輪。GenerateModelAsync() 通過 架構 來實現這一點,該架構列出了要生成的部分,如下列代碼片段所示:
位於 ServerScriptService 的腳本
local GenerationService = game:GetService("GenerationService")
local Workspace = game:GetService("Workspace")
-- 設置生成幾何的輸入
local inputs = {
TextPrompt = "綠色龍車,具有 4 個輪子"
}
-- 將架構設置為預定義的五模型汽車底盤
local schema = {
PredefinedSchema = "Car5"
}
-- 發呼叫生成模型
local success, result, metadata = pcall(function()
return GenerationService:GenerateModelAsync(inputs, schema)
end)
if success then
-- 將模型縮放到目標大小並將其放置在世界中心附近
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))
-- 固定所有部件,以免網格掉落
for _, descendant in result:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.Anchored = true
end
end
-- 命名模型並將其父級設為工作空間
result.Name = "基本龍車生成"
result.Parent = Workspace
else
warn(result)
end
下圖顯示了預期的輸出及其在 資源管理器 結構中的建構情況:


可重新定位的腳本
在 Roblox 中,行為 通常包含附加到靜態紋理幾何上的腳本、附件、約束 和其他實例類型,以使它們功能性。由於 GenerateModelAsync() 會即時生成廣泛的幾何,因此必須附上 可重新定位的腳本 以自動適應行為以符合預期的功能性。
例如,考慮一個讓玩家製作自駕車的遊戲。GenerateModelAsync() 接收玩家的提示並通過 Car5 架構 生成五個不同的網格(車身和四個輪子)。然後,一個預設的可重新定位腳本將其駕駛行為調整為模型的大小和形狀,以確保汽車可駕駛,並且輪子能夠現實地旋轉。
要測試可重新定位的腳本:
下載 Behaviors.rbxm 檔案。
在 Studio 的 資源管理器 結構中,右鍵單擊 ReplicatedStorage,選擇 插入 ⟩ 導入 Roblox 模型,然後選擇下載的檔案。模型將解壓成幾個文件夾。

根據您想生成的物件類型,將以下代碼片段之一複製並粘貼到 ServerScriptService 中的服務器 Script。
此示例生成一輛功能性汽車,具有剎車、氮氣增壓、音效和視覺效果,以及一個屏幕上顯示的速度計。
位於 ServerScriptService 的腳本local GenerationService = game:GetService("GenerationService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local Workspace = game:GetService("Workspace")-- 設置生成幾何的輸入local inputs = {TextPrompt = "綠色龍車,具有 4 個輪子"}-- 將架構設置為預定義的五模型汽車底盤local schema = {PredefinedSchema = "Car5"}-- 發呼叫生成模型local success, result, metadata = pcall(function()return GenerationService:GenerateModelAsync(inputs, schema)end)if success then-- 將模型縮放到目標大小local targetSize = 16local modelSize = result:GetExtentsSize()local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)result:ScaleTo(scaleFactor)-- 載入 "makeFunctional" 模塊以“CarBehavior”local makeFunctional = require(ReplicatedStorage.Behaviors.CarBehavior.makeFunctional)-- 通過名稱引用汽車部件,這些名稱是通過 "Car5" 架構保證的local body = result:FindFirstChild("body")local frontLeftWheel = result:FindFirstChild("front left wheel")local frontRightWheel = result:FindFirstChild("front right wheel")local rearLeftWheel = result:FindFirstChild("rear left wheel")local rearRightWheel = result:FindFirstChild("rear right wheel")-- 設置行為配置參數local config = {seatPosition = "inside",invisibleWhenSeated = false}-- 通過 "makeFunctional" 腳本附加行為local functionalModel = makeFunctional(result, frontLeftWheel, frontRightWheel, rearLeftWheel, rearRightWheel, body, config)-- 將模型放置在世界中心附近functionalModel:PivotTo(CFrame.new(0, functionalModel:GetExtentsSize().Y / 2, -40))functionalModel.Name = "基本龍車生成"functionalModel.Parent = Workspaceelsewarn(result)end