Através de prompts de texto e schemas predefinidos, você (e os jogadores no jogo) podem gerar tanto ativos 3D estáticos quanto modelos totalmente funcionais como veículos que dirigem, aviões que voam e armas que disparam. Este guia demonstra como usar GenerateModelAsync() como parte de uma experiência criativa dinâmica e guiada pelos jogadores.
Visão geral
GenerateModelAsync() permite a geração de geometrias de múltiplas malhas com as seguintes vantagens:
- O schema fornecido define como a geometria gerada será dividida em partes.
- Qualquer objeto gerado no jogo será replicado e visível para todos os jogadores, permitindo que eles construam juntos em tempo real.
- As malhas geradas são de maior fidelidade com melhores formas gerais, silhuetas, mais detalhes e menos artefatos. As texturas geradas são mais coerentes e detalhadas, com menos granulação e iluminação embutida menos pronunciada.
- Os tempos de geração possuem menor latência, permitindo uma criação mais rápida e responsiva nos jogos.
- Você e até mesmo os jogadores durante o jogo podem especificar caixas delimitadoras para sugerir tamanho e proporções do modelo gerado.
- Uma contagem máxima de triângulos opcional mantém os objetos gerados eficientes para o seu jogo.
Geração baseada em schema
Para criar objetos articulados e funcionais, a geometria gerada deve ser separada em múltiplos MeshParts. Por exemplo, para criar um carro dirigível com rodas que giram e direcionam, são necessárias pelo menos cinco MeshParts: uma para a carroceria do carro e quatro para cada uma das rodas do carro. GenerateModelAsync() realiza isso através de um schema que lista as partes a serem geradas, como mostrado no seguinte trecho de código:
Script em ServerScriptService
local GenerationService = game:GetService("GenerationService")
local Workspace = game:GetService("Workspace")
-- Configurar entradas para a geometria gerada
local inputs = {
TextPrompt = "carro dragão verde com 4 rodas"
}
-- Definir schema para o chassi de carro de cinco modelos pré-definido
local schema = {
PredefinedSchema = "Car5"
}
-- Fazer a chamada para gerar o modelo
local success, result, metadata = pcall(function()
return GenerationService:GenerateModelAsync(inputs, schema)
end)
if success then
-- Escalar modelo para o tamanho alvo e posicioná-lo perto do centro do mundo
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))
-- Ancorar todas as partes para que as malhas não se desfaçam
for _, descendant in result:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.Anchored = true
end
end
-- Nomear o modelo e parentá-lo ao workspace
result.Name = "GeraçãoCarroDragãoBásico"
result.Parent = Workspace
else
warn(result)
end
A imagem a seguir mostra a saída esperada e sua construção conforme aparece na hierarquia do Explorer:


Scripts retargetáveis
No Roblox, comportamentos geralmente englobam os scripts, anexos, restrições e outros tipos de instâncias anexados a geometrias texturizadas estáticas para torná-las funcionais. Como GenerateModelAsync() gera uma ampla gama de geometrias em tempo real, scripts retargetáveis devem ser anexados para adaptar automaticamente os comportamentos à funcionalidade esperada.
Por exemplo, considere um jogo onde os jogadores podem criar seus próprios carros dirigíveis. GenerateModelAsync() pega o prompt do jogador e gera cinco malhas distintas (carroceria e quatro rodas) através do schema Car5. Em seguida, um script retargetável predefinido adapta seu comportamento de direção ao tamanho e forma do modelo para garantir que o carro seja dirigível e suas rodas girem de forma realista.
Para testar scripts retargetáveis:
Baixe o Behaviors.rbxm arquivo.
Na hierarquia do Explorer do Studio, clique com o botão direito em ReplicatedStorage, selecione Inserir ⟩ Importar Modelo Roblox, e escolha o arquivo baixado. O modelo é descompactado em várias pastas.

Copie e cole um dos seguintes trechos de código em um Script do servidor dentro de ServerScriptService, dependendo do tipo de objeto que você gostaria de gerar.
Este exemplo gera um carro funcional com freio, impulso de nitro, efeitos de áudio e visuais, e um velocímetro na tela.
Script em ServerScriptServicelocal GenerationService = game:GetService("GenerationService")local ReplicatedStorage = game:GetService("ReplicatedStorage")local Workspace = game:GetService("Workspace")-- Configurar entradas para a geometria geradalocal inputs = {TextPrompt = "carro dragão verde com 4 rodas"}-- Definir schema para o chassi de carro de cinco modelos pré-definidolocal schema = {PredefinedSchema = "Car5"}-- Fazer a chamada para gerar o modelolocal success, result, metadata = pcall(function()return GenerationService:GenerateModelAsync(inputs, schema)end)if success then-- Escalar modelo para o tamanho alvolocal targetSize = 16local modelSize = result:GetExtentsSize()local scaleFactor = targetSize / math.max(modelSize.X, modelSize.Y, modelSize.Z)result:ScaleTo(scaleFactor)-- Carregar módulo "makeFunctional" para "CarBehavior"local makeFunctional = require(ReplicatedStorage.Behaviors.CarBehavior.makeFunctional)-- Referenciar partes do carro por nomes garantidos através do schema "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")-- Configurar parâmetros de configuração comportamentallocal config = {seatPosition = "inside",invisibleWhenSeated = false}-- Anexar comportamento via o script "makeFunctional"local functionalModel = makeFunctional(result, frontLeftWheel, frontRightWheel, rearLeftWheel, rearRightWheel, body, config)-- Posicionar o modelo perto do centro do mundofunctionalModel:PivotTo(CFrame.new(0, functionalModel:GetExtentsSize().Y / 2, -40))functionalModel.Name = "GeraçãoCarroDragãoBásico"functionalModel.Parent = Workspaceelsewarn(result)end