通过文本提示和预设架构,您(以及游戏中的玩家)可以生成静态 3D 资产和完全功能的模型,例如可以行驶的车辆、可以飞行的飞机和可以射击的武器。本指南演示了如何将 GenerateModelAsync() 作为动态、玩家驱动的创意体验的一部分来使用。
概述
GenerateModelAsync() 使得生成多网格几何体成为可能,具备以下优点:
- 提供的 架构 定义了生成的几何体如何被拆分为多个部分。
- 在游戏中生成的任何对象都会被复制并对所有玩家可见,允许他们实时协作建立。
- 生成的网格具有更高的保真度,整体形状、轮廓更佳,细节更多,伪影更少。生成的纹理更一致、更细致,颗粒感更小,烘焙的照明效果不那么明显。
- 生成时间具有更低的延迟,使得游戏中的创建更快速、更及时。
- 您甚至可以在游戏中指定边界框,以建议生成模型的大小和比例。
- 可选的最大三角形计数可以保持生成对象对您的游戏的性能。
基于架构的生成
要创建具有关节和功能的对象,生成的几何体必须拆分为多个 MeshParts。例如,要创建一辆可以驾驶的汽车,其车轮能够旋转和转向,则需要至少五个 MeshParts:一个用于车身,四个用于汽车的四个轮子。GenerateModelAsync() 通过一个架构来实现这一点,该架构列出了要生成的部分,如以下代码片段所示:
Script in 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
以下图片展示了预期的输出及其在 Explorer 层次结构中的构造:


可重定向脚本
在 Roblox 中,行为通常指的是附加到静态纹理几何体的脚本、附件、约束和其他实例类型,使其功能性得以实现。由于 GenerateModelAsync() 动态生成各种几何体,因此需要附加 可重定向脚本 以自动调整行为,以符合预期功能。
例如,考虑一个游戏,玩家可以制作自己的可驾驶汽车。GenerateModelAsync() 接受玩家提示并通过 Car5 架构 生成五种不同的网格(车身和四个轮子)。然后,预设的可重定向脚本将其驾驶行为调整为与模型的大小和形状相适应,以确保汽车可驾驶且轮子真实旋转。
要测试可重定向脚本:
下载 Behaviors.rbxm 文件。
在 Studio 的 Explorer 层次结构中,右键单击 ReplicatedStorage,选择 插入 ⟩ 导入 Roblox 模型,然后选择下载的文件。该模型将解包到多个文件夹中。

根据您希望生成的对象类型,将以下代码片段之一复制并粘贴到 ServerScriptService 中的服务器 Script 中。
这个示例生成一个带刹车、氮气加速、音频和视觉效果,以及屏幕上 UI 速度表的功能性汽车。
Script in ServerScriptServicelocal 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("车身")local frontLeftWheel = result:FindFirstChild("前左轮")local frontRightWheel = result:FindFirstChild("前右轮")local rearLeftWheel = result:FindFirstChild("后左轮")local rearRightWheel = result:FindFirstChild("后右轮")-- 设置行为配置参数local config = {seatPosition = "内部",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