Classe do mecanismo
ProceduralModel
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Resumo
Propriedades
Métodos
Referência API
Propriedades
Generator
Amostras de código
Módulo Gerador Padrão
-- Um módulo gerador é um ModuleScript que define como um ProceduralModel constrói seu conteúdo.
-- Veja https://create.roblox.com/docs/reference/engine/classes/ProceduralModel para detalhes.
--
-- Para ser usado como um gerador, o ModuleScript deve retornar uma tabela com dois campos:
-- * `Attributes` - uma tabela de valores padrão. Cada chave se torna um atributo em cada
-- ProceduralModel que usa este gerador. Os usuários podem então ajustar esses
-- atributos no painel de Propriedades para reexecutar a geração com novos inputs.
-- * `OnGenerate` - uma função que o motor chama para (re)construir o conteúdo do modelo.
--
-- Nada sobre este script ou sua colocação é especial. Ele pode viver em qualquer lugar no DataModel
-- e a propriedade `Generator` em um ProceduralModel pode ser redefinida para apontar para ele.
-- As anotações de tipo abaixo são opcionais, mas documentadas aqui para que a forma necessária fique explícita.
-- `GenerationFunctionParams` é passada para `OnGenerate` toda vez que a geração é executada. Ela expõe:
-- * `Attributes` - os valores de atributo atuais no ProceduralModel.
-- * `Size` - o volume delimitador para gerar dentro (de `ProceduralModel.Size`).
-- * `Pause` - uma pausa cooperativa. Chame `parameters:Pause()` dentro de loops longos para que grandes
-- gerações não travem a thread de chamada; o motor pode lhe retomar depois.
type GenerationFunctionParams<Attributes> = {
Attributes: Attributes,
Size: Vector3,
Pause: (self: GenerationFunctionParams<Attributes>) -> (),
}
-- `GeneratorModuleDefinition` é a tabela que o ModuleScript deve retornar.
-- `OnGenerate` não deve retornar um valor; em vez disso, parent instâncias geradas no `targetContainer`.
-- Qualquer coisa parentada ao `targetContainer` (ou seus descendentes) se torna a saída da geração.
type GeneratorModuleDefinition<Attributes> = {
Attributes: Attributes,
OnGenerate: (
parameters: GenerationFunctionParams<Attributes>,
targetContainer: GeneratedFolder
) -> (),
}
-- Atributos padrão. Cada entrada aqui aparece como um atributo editável no ProceduralModel.
-- Um `RandomSeed` fixo mantém a geração determinística: as mesmas entradas sempre produzem a mesma
-- saída, o que é importante porque a geração pode ser executada muitas vezes conforme o usuário edita as propriedades.
local defaultAttributes = {
BorderThickness = 1,
RandomSeed = 142376088,
}
local Generator: GeneratorModuleDefinition<typeof(defaultAttributes)> = {
Attributes = defaultAttributes,
OnGenerate = function(parameters, targetContainer)
-- Inputs. `parameters.Attributes` reflete o que o usuário definiu no
-- ProceduralModel; `parameters.Size` é a caixa delimitadora para construir.
local borderThickness = parameters.Attributes.BorderThickness
local random = Random.new(parameters.Attributes.RandomSeed)
local size = parameters.Size
-- Valores derivados. O `random` semeado acima torna estes reprodutíveis por RandomSeed.
local minSize = math.min(size.X, size.Y, size.Z)
local baseColor = Color3.fromHSV(random:NextNumber(0.5, 0.8), 0.7, 0.8)
local outlineColor = Color3.fromHSV(random:NextNumber(), 0.4, 0.25)
-- Pequenos helpers para fazer a construção abaixo ler de cima para baixo. Você não precisa
-- de helpers como estes para escrever um gerador; eles apenas reduzem a repetição.
local function assignProperties(instance: Instance, properties: { [string]: unknown })
-- Defina o Parent por último para que outras propriedades estejam no lugar antes que a instância entre
-- no DataModel e dispare eventos Changed.
for name, value in properties do
if name ~= "Parent" then
(instance :: any)[name] = value
end
end
if properties.Parent ~= nil then
instance.Parent = properties.Parent :: Instance
end
return instance
end
local function createInstance(className: string, properties: { [string]: unknown })
return assignProperties(Instance.new(className), properties)
end
local function createPartWithDefaults(properties: { [string]: unknown })
-- As partes geradas são tipicamente ancoradas e não colidem; substitua por parte conforme necessário.
local part = createInstance("Part", {
Anchored = true,
CanCollide = false,
Color = baseColor,
Material = Enum.Material.SmoothPlastic,
BottomSurface = Enum.SurfaceType.Smooth,
TopSurface = Enum.SurfaceType.Smooth,
})
return assignProperties(part, properties)
end
-- Tudo abaixo parenta no `targetContainer`, que é como instâncias se tornam
-- parte da saída gerada. Instâncias não parentadas aqui são descartadas.
-- Parte delimitadora invisível usada como o adorno do billboard.
local bounds = createPartWithDefaults({
Name = "Bounds",
Parent = targetContainer,
Transparency = 1,
Size = size,
})
-- Uma plataforma rebaixada com um contorno de borda embaixo.
local base = createPartWithDefaults({
Name = "PlatformBase",
Parent = targetContainer,
Color = baseColor,
CFrame = CFrame.new(0, (-size.Y + 1) / 2, 0),
Size = Vector3.new(
size.X - 2 * borderThickness,
1.01,
size.Z - 2 * borderThickness
),
})
local outline = createPartWithDefaults({
Name = "PlatformOutline",
Parent = targetContainer,
Color = outlineColor,
Position = Vector3.yAxis * (-size.Y + 1) / 2,
Size = Vector3.new(size.X, 1, size.Z),
})
-- "Olá Mundo!" billboard. Geradores podem criar qualquer tipo de instância, não apenas partes.
local billboard = createInstance("BillboardGui", {
Name = "Text",
Parent = targetContainer,
Adornee = bounds,
LightInfluence = 0,
Size = UDim2.fromScale(minSize, minSize),
})
local textLabel = createInstance("TextLabel", {
Name = "HelloWorld",
Parent = billboard,
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Position = UDim2.fromScale(0.5, 0.5),
Size = UDim2.fromScale(1, 1),
Text = "Olá Mundo!",
TextColor3 = baseColor,
TextScaled = true,
TextStrokeTransparency = 0,
})
local textStroke = createInstance("UIStroke", {
Parent = textLabel,
Color = outlineColor,
Thickness = borderThickness * 3,
})
end,
}
-- Retornar a definição do módulo é o que torna este ModuleScript utilizável como um `Generator`.
return GeneratorMódulo Gerador de Escada Clássico
-- Um módulo gerador é um ModuleScript que retorna uma tabela com `Attributes` e `OnGenerate`.
-- Atribuir este ModuleScript à propriedade `Generator` de um ProceduralModel executa `OnGenerate`
-- sempre que o tamanho do modelo, atributos ou a fonte do módulo mudam.
-- Veja https://create.roblox.com/docs/reference/engine/classes/ProceduralModel.
local ClassicRobloxLadderGenerator = {}
-- Valores padrão dos atributos. Cada chave se torna um atributo editável em qualquer ProceduralModel que
-- usa este gerador, e aparece no painel de Propriedades do Studio sob Atributos. Editar qualquer
-- um deles re-executa `OnGenerate` com os novos valores.
ClassicRobloxLadderGenerator.Attributes = {
RungSpacing = 2,
RungThickness = 1,
PostSize = 1,
Color = Color3.new(0.5, 0.3, 0),
}
-- `OnGenerate` é chamado pelo mecanismo para construir o conteúdo do modelo.
-- Contrato:
-- * `parameters.Size` - a caixa delimitadora (de `ProceduralModel.Size`) para construir dentro.
-- * `parameters.Attributes` - valores atuais dos atributos no ProceduralModel.
-- * `parameters:Pause()` - ceder cooperativamente; chamar dentro de loops longos para grandes gerações
-- não travarem a thread.
-- * `targetContainer` - qualquer coisa parentada aqui (ou em seus descendentes) se torna a saída.
-- * Não retorne um valor de `OnGenerate`; as saídas são comunicadas via `targetContainer`.
ClassicRobloxLadderGenerator.OnGenerate = function(parameters, targetContainer)
local size = parameters.Size
local rungThickness = parameters.Attributes.RungThickness
local postSize = parameters.Attributes.PostSize
local count = (size.Y - rungThickness) // parameters.Attributes.RungSpacing + 1
local function createPart(position, size)
local part = Instance.new("Part")
part.Size = size
part.Position = position
part.Anchored = true
part.Color = parameters.Attributes.Color
part.TopSurface = Enum.SurfaceType.Smooth
part.BottomSurface = Enum.SurfaceType.Smooth
-- Parentear no `targetContainer` é o que adiciona a parte à saída gerada.
part.Parent = targetContainer
end
-- Degraus, empilhados do fundo da caixa delimitadora para cima.
local position = Vector3.new(0, -size.Y / 2 + rungThickness / 2, 0)
for i = 1, count do
-- Ceder entre os degraus para que uma escada com muitos degraus não bloqueie a thread.
parameters:Pause()
createPart(position, Vector3.new(size.X - 2 * postSize, rungThickness, size.Z))
position += Vector3.new(0, parameters.Attributes.RungSpacing, 0)
end
-- Postes laterais à esquerda e à direita abrangendo toda a altura.
createPart(Vector3.new(-0.5 * size.X + postSize / 2, 0, 0), Vector3.new(postSize, size.Y, size.Z))
createPart(Vector3.new(0.5 * size.X - postSize / 2, 0, 0), Vector3.new(postSize, size.Y, size.Z))
end
-- Retornar a definição do módulo é o que torna este ModuleScript utilizável como um `Generator`.
return ClassicRobloxLadderGeneratorMétodos