Model

Mostrar obsoleto

*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:

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.

Basic Model Instantiation

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

Propriedades herdados de PVInstance

Métodos

  • AddPersistentPlayer(playerInstance : Player):()

    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.

  • MoveTo(position : Vector3):()

    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.

  • RemovePersistentPlayer(playerInstance : Player):()

    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.

  • ScaleTo(newScaleFactor : number):()

    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.

  • TranslateBy(delta : Vector3):()

    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.

Métodos herdados de PVInstance

Propriedades

Segurança do plugin
Ler Parallel

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

Ler Parallel

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

Ler Parallel

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.

Throwing Dice

-- 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

Não replicado
Não scriptável
Ler Parallel

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

Não replicado
Ler Parallel

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 = model
Workspace.RedPart.Parent = model
model.Parent = Workspace
print(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.

Reset Pivot

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

AddPersistentPlayer

()

Parâmetros

playerInstance: Player
Valor Padrão: "nil"

Devolução

()

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.Model
local part = Workspace.Part
local orientation, size = model:GetBoundingBox()
-- Redimensionar e posicionar a peça igual à caixa de modelo
part.Size = size
part.CFrame = orientation

Devolução

Um CFrame representando a orientação do volume seguido por um Vector3 representando o tamanho do volume.

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

O tamanho da extensão Vector3 do Model.

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.

Model GetExtentsSize

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

Instances

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

Instances

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.

Substituting in a replacement model using PivotTo and ScaleTo

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

position: Vector3

O Vector3 o Model é movido para.

Valor Padrão: ""

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.

Model MoveTo

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)

RemovePersistentPlayer

()

Parâmetros

playerInstance: Player
Valor Padrão: "nil"

Devolução

()

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

newScaleFactor: number
Valor Padrão: ""

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

delta: Vector3

O Vector3 para traduzir o Model por.

Valor Padrão: ""

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.

Model TranslateBy

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)

Eventos