Model
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Modelos são objetos de contêiner, o que significa que eles agrupam objetos juntos.Eles são melhores usados para armazenar coleções de BaseParts e têm uma série de funções que expandem sua funcionalidade.
Modelos são destinados a representar grupos geométricos .Se sua agrupamento não tiver interpretação geométrica, por exemplo, uma coleção de Scripts , use um Folder em vez disso.
Modelos cujas partes constituintes sejam combinadas com juntas (para que possam se mover ou serem destruídos por meio de simulação de física) geralmente têm um configurarPrimaryPart, pois especifica qual parte dentro do modelo a alavanca e a caixa de contorno "seguirão" à medida que o modelo se move.Modelos estáticos que permanecem em um único local não se beneficiam de ter um configurarde peças primárias.
Modelos têm um amplo leque de aplicações, incluindo personagens de jogadores do Roblox.Eles também têm uma série de comportamentos únicos que são importantes para ter em mente:
- Quando um Humanoid e um Part chamado Cabeça são parentados sob um modelo, uma GUI de nome/saúde aparecerá sobre o modelo; veja Nome/Exibição de Saúde de Personagem para detalhes.
- Se a posição de uma peça no eixo Y atingir o valor Workspace.FallenPartsDestroyHeight, e ela foi o último objeto dentro de um Model, o modelo também será destruído.
- Quando usado em um local com Workspace.StreamingEnabled definido como verdadeiro, o valor de ModelStreamingMode controla vários comportamentos em torno de como o modelo e quaisquer descendentes são replicados e/ou removidos dos clientes.Além disso, o valor de LevelOfDetail afeta a renderização do modelo.
Como em todos os tipos Instance tipos, o fato de um pai Model ser replicado para um cliente não garante que todos os seus filhos sejam replicados.Isso é particularmente importante se essas instâncias estiverem sendo acessadas por código executando no cliente, como em um LocalScript .Usar ModelStreamingMode com valores como Atomic pode garantir que todo o modelo e todos os seus descendentes estejam presentes se o modelo pai existir no cliente, ou você pode usar WaitForChild() quando a atomicidade não for desejada.
Amostras de código
The following sample includes a basic function that takes a table of objects and parents them into a new Model, returning that Model.
local function groupObjects(objectTable)
local model = Instance.new("Model")
for _, object in pairs(objectTable) do
object.Parent = model
end
return model
end
local objects = {
Instance.new("Part"),
Instance.new("Part"),
}
groupObjects(objects)
Resumo
Propriedades
Define o nível de detalhe no modelo para experiências com streaming de instâncias ativado.
Controla o comportamento de streaming de modelo em Models.
A parte principal do Model ou nil se não for explicitamente configurar.
Propriedade exclusiva do editor usada para escalar o modelo em torno de seu pivô. Definir essa propriedade moverá a escala como se Model/ScaleTo fosse chamada sobre ela.
Determina onde o pivô de um Model que não tem não tem um conjunto Model.PrimaryPart está localizado.
Métodos
Define esse modelo para ser persistente para o jogador especificado. Model.ModelStreamingMode deve ser definido como PersistentePerPlayer para que o comportamento seja alterado como resultado da adição.
Retorna uma descrição de um volume que contém todas as partes de um Modelo.
Retorna o tamanho da caixa de contorno mais pequena que contém todo o BaseParts na Model, alinhado com o Model.PrimaryPart se for configurar.
Retorna todos os objetos Player que este objeto de modelo é persistente para.O comportamento varia dependendo de se este método é chamado de um Script ou de um LocalScript.
Retorna a escala canônica do modelo, que padrão é 1 para modelos recém-criados e mudará à medida que for escalado via Model/ScaleTo.
Mova o PrimaryPart para a posição dada. Se uma parte primária não tiver sido especificada, a parte raiz do modelo será usada.
Torna esse modelo não persistente mais para o jogador especificado.Model.ModelStreamingMode deve ser definido como PersistentePerPlayer para que o comportamento seja alterado como resultado da remoção.
Define o fator de escala do modelo, ajustando o tamanho e a localização de todas as Instâncias descendentes de modo que elas tenham esse fator de escala em relação aos seus tamanhos e locais iniciais quando o fator de escala era 1.
Muda um Model por o deslocamento dado Vector3, preservando a orientação do modelo.Se outro BasePart ou Terrain já existir na nova posição, então o Model vai sobrepor o Objetodito.
Obtém o pivô de um PVInstance .
Transforma o PVInstance ao longo de todos os seus descendentes PVInstances de modo que o pivô agora está localizado no CFrame especificado.
Propriedades
LevelOfDetail
Define o nível de detalhe no modelo para experiências com streaming de instância ativado.
Quando definido para StreamingMesh , uma malha de "impostor" de resolução mais baixa (colorida, malha grossa que envolve todas as partes filhas do modelo) rende fora do raio de streaming.
Quando definido para Disabled ou Automatic, malhas de resolução inferior não serão exibidas.
ModelStreamingMode
Controla como Models são transmitidos para dentro e para fora quando a instância streaming for ativada.O comportamento depende do enum selecionado.Não tem efeito quando o streaming não está ativado.
Essa propriedade só deve ser alterada no Studio através da janela Propriedades quando o streaming estiver ativado, ou em Scripts , mas nunca em LocalScripts (fazer isso pode resultar em comportamento não definido).
PrimaryPart
Aponta para a parte principal do Model .A parte principal é a BasePart que atua como referência física para o pivô do modelo.Ou seja, quando peças dentro do modelo são movidas devido à simulação física ou a outros meios, o pivô se moverá em sincronia com a peça principal.
Observe que Models não tem PrimaryPart definido por padrão.Se você estiver criando um modelo que precisa ser atuado pela física, você deve definir manualmente essa propriedade no Studio ou dentro de um script.Se a parte principal não for configurar, o pivô permanecerá no mesmo local no espaço do mundo, mesmo que as partes dentro do modelo sejam movidas.
Observe também que ao definir essa propriedade, deve ser um BasePart que é um descendente do modelo.Se você tentar definir Model.PrimaryPart para um BasePart que é não um descendente do modelo, ele será definido para essa parte, mas redefinido para nil durante o próximo passo de simulação — este é o comportamento legado para suportar scripts que presumem que podem definir temporariamente a parte principal para um BasePart que não é um descendente do modelo.
A regra geral para modelos é que:
- Modelos cujas partes sejam combinadas através de juntas físicas, como WeldConstraints ou Motor6Ds, devem ter uma parte primária atribuída.Por exemplo, os modelos de personagens do Roblox têm seu Model.PrimaryPart definido para o HumanoidRootPart por padrão.
- Modelos estáticos (normalmente Anchored ) que permanecem em um lugar a menos que um script os mova explicitamente não requerem um Model.PrimaryPart e tendem a não se beneficiar de ter um configurar.
Amostras de código
This code sample creates and throws a dice model, then outputs whether it landed with the blue side facing up. If Model.PrimaryPart was not set, the pivot / bounding box of the dice would rotate, as the parts inside of it are physically simulated during the roll.
-- Create a dice model with two halves and attach them together
local diceModel = Instance.new("Model")
diceModel.Name = "ChanceCube"
local diceTop = Instance.new("Part")
diceTop.Size = Vector3.new(4, 2, 4)
diceTop.Position = Vector3.new(0, 1, 0)
diceTop.Color = Color3.new(0, 0, 1)
diceTop.Parent = diceModel
local diceBottom = diceTop:Clone()
diceBottom.Position = Vector3.new(0, -1, 0)
diceBottom.Color = Color3.new(1, 0, 0)
diceBottom.Parent = diceModel
local weld = Instance.new("WeldConstraint")
weld.Part0 = diceTop
weld.Part1 = diceBottom
weld.Parent = diceModel
-- Put the dice up in the air above the workspace origin (does not require a primary part)
diceModel.Parent = workspace
diceModel:PivotTo(CFrame.new(0, 10, 0))
-- Assign the primary part before physical simulation
-- Without this line, the script will always output the same thing and the bounding box of the model will not change orientation
diceModel.PrimaryPart = diceTop
-- Wait a bit before rolling the dice (let it settle onto the floor)
for i = 5, 1, -1 do
print("Rolling dice in...", i)
task.wait(1)
end
diceTop:ApplyAngularImpulse(Vector3.new(15000, 1000, 5000))
diceTop:ApplyImpulse(Vector3.new(0, 3000, 0))
task.wait(1)
-- Wait for the roll to complete
while diceTop.AssemblyLinearVelocity.Magnitude > 0.1 or diceTop.AssemblyAngularVelocity.Magnitude > 0.1 do
task.wait()
end
-- Get the dice orientation, impacted by the primary part
local orientation = diceModel:GetBoundingBox()
if orientation.YVector.Y > 0.5 then
print("It's the boy!")
else
print("It's his mother!")
end
Scale
Definir esta propriedade na janela Propriedades escalará o modelo como se Model/ScaleTo fosse chamado sobre ele, escalando todas as Instâncias descendentes no modelo, como materiais, imagens e a geometria 3D de peças, para que o modelo tenha o fator de escala especificado em relação ao seu tamanho original.
Essa propriedade está disponível apenas no Studio e causará um erro se usada em um Script ou LocalScript.Model/ScaleTo e Model/GetScale devem ser usados a partir de scripts.
WorldPivot
Essa propriedade determina onde está localizado o pivô de um que não tem um conjunto não definido.Se o Model faz tem um PrimaryPart , o pivô do Model é igual ao pivô dessa parte primária em vez disso, e esta propriedade WorldPivot é ignorada.
Para um recém-criado , seu pivô será tratado como o centro da caixa de delimitação de seus conteúdos até que a propriedade primeira vez seja configurar.Uma vez que o pivô mundial é definido pela primeira vez, é impossível restaurar esse comportamento inicial.
Na maioria das vezes, mover o modelo com as ferramentas do Studio, ou com funções de movimento de modelo como PVInstance:PivotTo() e Model:MoveTo(), definirá o pivô mundial e, assim, encerrará esse novo comportamento do modelo.
O objetivo desse comportamento é permitir que o código Luau obtenha um pivô sensato simplesmente criando um novo modelo e associando objetos a ele, evitando a necessidade de definir explicitamente Model.WorldPivot.
local Workspace = game:GetService("Workspace")local model = Instance.new("Model")Workspace.BluePart.Parent = modelWorkspace.RedPart.Parent = modelmodel.Parent = Workspaceprint(model:GetPivot()) -- Currently equal to the center of the bounding box containing "BluePart" and "RedPart"model:PivotTo(CFrame.new(0, 10, 0)) -- This works without needing to explicitly set "model.WorldPivot"
Amostras de código
This code sample shows a custom function for resetting the pivot of a model back to the center of that model's bounding box.
local function resetPivot(model)
local boundsCFrame = model:GetBoundingBox()
if model.PrimaryPart then
model.PrimaryPart.PivotOffset = model.PrimaryPart.CFrame:ToObjectSpace(boundsCFrame)
else
model.WorldPivot = boundsCFrame
end
end
resetPivot(script.Parent)
Métodos
GetBoundingBox
Essa função retorna uma descrição de um volume que contém todos os BasePart dentro de um Model.A orientação do volume é baseada na orientação do PrimaryPart , e corresponde à caixa de seleção renderizada no Studio quando o modelo é selecionado.Refletindo o comportamento de Terrain:FillBlock() , ele retorna um CFrame representando o centro da caixa de delimitação e um Vector3 representando seu tamanho.
Se não houver PrimaryPart para o modelo, a caixa de delimitação será alinhada com os eixos do mundo.
local Workspace = game:GetService("Workspace")local model = Workspace.Modellocal part = Workspace.Partlocal orientation, size = model:GetBoundingBox()-- Redimensionar e posicionar a peça igual à caixa de modelopart.Size = sizepart.CFrame = orientation
Devolução
GetExtentsSize
Retorna o tamanho da caixa de contorno mais pequena que contém todo o BaseParts na Model.Se Model.PrimaryPart existir, então a caixa de borda será alinhada àquela parte.Se uma parte primária não foi definida, a função escolherá uma parte no modelo para alinhar a caixa de borda.Como a seleção dessa parte não é determinística, é recomendado definir um Model.PrimaryPart para obter resultados consistentes com essa função.
Observe que essa função retorna apenas o tamanho da menor caixa de delimitação e o desenvolvedor deve empregar seu próprio método para obter a posição da caixa de delimitação.
Devolução
Amostras de código
The code sample below demonstrates how Model.GetExtentsSize can be used to get the size of the bounding box containing the parts.
local model = Instance.new("Model")
model.Parent = workspace
local RNG = Random.new()
for _ = 1, 5 do
local part = Instance.new("Part")
part.Anchored = true
part.Size = Vector3.new(RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5), RNG:NextNumber(0.05, 5))
part.Parent = model
end
print(model:GetExtentsSize())
GetPersistentPlayers
Quando este método é chamado de um Script , ele retorna todos os objetos Player persistentes para os quais este modelo é persistente.Quando chamado a partir de um LocalScript , este método verifica apenas se este modelo é persistente para o LocalPlayer .
Devolução
Uma tabela com todos os Player objetos que este objeto de modelo é persistente para.
GetScale
Modelos contêm um fator de escala canônico persistente, que começa em 1 para modelos recém-criados e muda à medida que o modelo é escalado ao chamar Model/ScaleTo.Essa função retorna o fator de escala canônico atual do modelo.
O fator de escala atual não tem direto impacto no tamanho das Instâncias sob o modelo.É usado para fins de autoria de conteúdo e programação para lembrar como o modelo foi escalado em relação ao seu tamanho original.
Dentro de uma sessão dada, o modelo armazenará as informações precisas de tamanho original das Instâncias descendentes após a primeira chamada Model/ScaleTo.Isso significa que chamar ScaleTo(x) seguido por ScaleTo(1) vai te trazer de volta exatamente a configuração original do modelo sem derivação de ponto flutuante.Evitar a derivação de ponto flutuante é a motivação para ter uma função Escala Para em vez de uma função Escala Por .
O fator de escala impacta o comportamento do motor em uma maneira: o fator de escala de um modelo será aplicado a deslocamentos conjuntos de animations jogados em um AnimationController sob esse modelo, para que os rigs animados reproduzam corretamente as animações mesmo quando escalados.
Devolução
O fator de escala canônico atual do modelo.
Amostras de código
This code sample demonstrates substituting in a replacement for all the copies of a tree model using PivotTo and ScaleTo. The pivot and scale of the models are used as a reference ensuring that the relative sizes and locations of the replacement models match those of the originals.
local CollectionService = game:GetService("CollectionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Find all the models with the tag we want to replace
local items = CollectionService:GetTagged("Tree")
local newModel = ReplicatedStorage.FancyTreeReplacementModel
for _, item in items do
-- Make the new item and scale / position it where the old one was
local newItem = newModel:Clone()
newItem:ScaleTo(item:GetScale())
newItem:PivotTo(item:GetPivot())
-- Add the same tag to the replacement
CollectionService:AddTag(newItem, "Tree")
-- Delete the old item and parent the new one
newItem.Parent = item.Parent
item:Destroy()
end
MoveTo
Mova o PrimaryPart para a posição dada.Se uma parte primária não foi especificada, a parte raiz do modelo será usada, mas a parte raiz não é determinística e é recomendado que você sempre defina uma parte primária ao usar MoveTo().
Se houver qualquer obstrução onde o modelo deve ser movido, como Terrain ou outro BaseParts, o modelo será movido verticalmente para cima até que não haja nada no caminho.Se esse comportamento não for desejado, PVInstance:PivotTo() deve ser usado em vez disso.
Observe que a rotação não é preservada ao mover um modelo com MoveTo() .Recomenda-se usar TranslateBy() ou PVInstance:PivotTo() se a rotação atual do modelo precisar ser preservada.
Parâmetros
Devolução
Amostras de código
This sample demonstrates how Model:MoveTo avoids collisions.
A simple two part Model is created, and its PrimaryPart is set. An large obstruction part is placed next to it.
After 5 seconds Model:MoveTo is used to direct the model to move inside the obstruction part. However, as MoveTo will not move a model inside of an obstruction the Model is moved up on the Y axis and placed above the obstruction.
local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
model.Parent = workspace
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.Position = START_POSITION
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.Position = START_POSITION + Vector3.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
model:MoveTo(END_POSITION)
ScaleTo
Modelos contêm um fator de escala canônico persistente, que começa em 1 para modelos recém-criados.Essa função escala o modelo, em torno da localização de pivô, em relação a como ele olharia para um fator de escala de 1.Para realizar isso, ele faz duas coisas:
- Define o fator de escala atual do modelo para o valor especificado
- Redimensiona e reposiciona todas as Instâncias descendentes de acordo
A escalonamento de locais é feito em torno da localização de pivô.
Todas as propriedades "geométricas" das Instâncias descendentes serão escalonadas.Isso obviamente inclui os tamanhos das peças, mas aqui estão alguns outros exemplos de propriedades que são escalonadas:
- O comprimento de juntas como WeldConstraints e Class.Rope|Ropes
- Velocidades e forças físicas como Hinge.MaxServoTorque
- Propriedades visuais como tamanhos de emissores de partículas
- Outras propriedades de comprimento como Sound.RollOffMinDistance
Parâmetros
Devolução
TranslateBy
Muda um Model por o deslocamento dado Vector3, preservando a orientação do modelo.Se outro BasePart ou Terrain já existir na nova posição, então o Model vai sobrepor o Objetodito.
A tradução é aplicada no espaço mundial em vez do espaço do objeto, o que significa que, mesmo que as partes do modelo sejam orientadas de forma diferente, elas ainda se moverão ao longo do eixo padrão.
Parâmetros
Devolução
Amostras de código
This sample demonstrates how Model:TranslateBy ignores collisions and respects the orientation of the model.
A simple two part Model is created, rotated 45 degrees on the Y axis, and its PrimaryPart is set. An large obstruction part is placed next to it.
After 5 seconds Model:TranslateBy is used to direct the model to move inside the obstruction part. The model will move inside of the obstruction and maintain it's current orientation.
local START_POSITION = Vector3.new(-20, 10, 0)
local END_POSITION = Vector3.new(0, 10, 0)
local model = Instance.new("Model")
local part1 = Instance.new("Part")
part1.Size = Vector3.new(4, 4, 4)
part1.CFrame = CFrame.new(START_POSITION) * CFrame.Angles(0, math.rad(45), 0)
part1.Anchored = true
part1.BrickColor = BrickColor.new("Bright yellow")
part1.Parent = model
local part2 = Instance.new("Part")
part2.Size = Vector3.new(2, 2, 2)
part2.CFrame = part1.CFrame * CFrame.new(0, 3, 0)
part2.Anchored = true
part2.BrickColor = BrickColor.new("Bright blue")
part2.Parent = model
model.PrimaryPart = part1
model.Parent = workspace
local obstruction = Instance.new("Part")
obstruction.Name = "Obstruction"
obstruction.Size = Vector3.new(10, 10, 10)
obstruction.Position = Vector3.new(0, 10, 0)
obstruction.Transparency = 0.5
obstruction.Anchored = true
obstruction.BrickColor = BrickColor.new("Bright green")
obstruction.Parent = workspace
task.wait(3)
-- use TranslateBy to shift the model into the obstruction
model:TranslateBy(END_POSITION - START_POSITION)