Model
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
I modelli sono oggetti container, il che significa che gruppano gli oggetti insieme.Sono migliori per contenere collezioni di BaseParts e hanno una serie di funzioni che estendono la loro funzionalità.
I modelli sono destinati a rappresentare gruppi geometrici .Se la tua raggruppazione non ha alcuna interpretazione geometrica, ad esempio una collezione di Scripts , usa un Folder invece.
I modelli i cui componenti sono uniti con articolazioni (in modo che possano muoversi o essere distrutti tramite simulazione fisica) di solito hanno un set PrimaryPart , poiché specifica quale parte del modello la pivot e la scatola di confezionamento seguiranno come il modello si muove.I modelli statici che rimangono in un luogo non traggono vantaggio dall'avere un set di parti primarie.
I modelli hanno un'ampia gamma di applicazioni, tra cui i personaggi del giocatore Roblox.Hanno anche una serie di comportamenti unici che è importante tenere a mente:
- Quando un Humanoid e un Part chiamato Testa sono genitori sotto un modello, un nome/health GUI apparirà sopra il modello; vedi Nome del personaggio/visualizzazione della salute per i dettagli.
- Se la posizione di una parte sull'asse Y colpisce il valore Workspace.FallenPartsDestroyHeight, e era l'ultimo oggetto all'interno di un Model, anche il modello verrà distrutto.
- Quando viene utilizzato in un luogo con Workspace.StreamingEnabled impostato su vero, il valore di ModelStreamingMode controlla vari comportamenti su come il modello e qualsiasi discendente vengono replicati e/o rimossi dai client.Inoltre, il valore di LevelOfDetail influisce sul rendering del modello.
Come con tutti i tipi Instance tipi, il fatto che un genitore Model viene replicato a un client non garantisce che tutti i suoi figli vengono replicati.Questo è particolarmente importante se queste istanze vengono accessate da un codice in esecuzione sul client, come in un LocalScript .L'utilizzo di ModelStreamingMode con valori come Atomic può garantire che l'intero modello e tutti i suoi discendenti siano presenti se il modello padre esiste sul client, o puoi utilizzare WaitForChild() quando l' atomicità non è desiderata.
Campioni di codice
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)
Sommario
Proprietà
Imposta il livello di dettaglio sul modello per le esperienze con streaming di istanza abilitato.
Controlla il comportamento di streaming del modello su Models quando l' streaming delle istanze è abilitato.
La parte principale del Model , o nil se non esplicitamente impostata.
Proprietà utilizzata solo dall'editor per ridimensionare il modello attorno al suo asse. Impostare questa proprietà sposterà la scala come se Model/ScaleTo fosse stata chiamata su di essa.
Determina dove si trova il punto di rotazione di un che non ha un set è situato.
Metodi
Imposta questo modello per essere persistente per il giocatore specificato. ModelStreamingMode deve essere impostato su PersistentPerPlayer perché il comportamento venga cambiato come risultato dell'aggiunta.
Restituisce una descrizione di un volume che contiene tutte le parti di un modello.
Restituisce la dimensione della più piccola scatola di confine che contiene tutto il BaseParts in Model, allineata con la Model.PrimaryPart se è impostata.
Restituisce tutti gli oggetti Player che questo oggetto modello è persistente per.Il comportamento varia a seconda se questo metodo viene chiamato da un Script o da un LocalScript.
Restituisce la scala canonica del modello, che predefinisce 1 per i modelli appena creati e cambierà man mano che verrà scala tramite Model/ScaleTo .
Sposta il PrimaryPart a la posizione data. Se una parte primaria non è stata specificata, verrà utilizzata la parte radice del modello.
Rende questo modello non più persistente per il giocatore specificato.ModelStreamingMode deve essere impostato su PersistentPerPlayer perché il comportamento venga modificato come risultato della rimozione.
Imposta il fattore di ridimensionamento del modello, regolando la dimensione e la posizione di tutte le istanze discendenti in modo che abbiano quel fattore di ridimensionamento rispetto alle loro dimensioni iniziali e alla posizione quando il fattore di ridimensionamento era 1.
Sposta un Model con lo spostamento dato Vector3 , preservando l'orientamento del modello.Se un altro BasePart o Terrain esiste già nella nuova posizione allora il Model sovrapporrà l'oggetto dichiarato.
Ottiene il punto focale di un PVInstance .
Trasforma il PVInstance insieme a tutti i suoi discendenti PVInstances in modo che il punto di rotazione sia ora situato all'interno del CFrame specificato.
Proprietà
LevelOfDetail
Imposta il livello di dettaglio sul modello per le esperienze con streaming di istanza abilitato.
Quando è impostato su StreamingMesh , una griglia di risoluzione inferiore "imposter" (mesh colorato, grezza che avvolge tutte le parti figlie del modello) rende fuori dal raggio di streaming.
Quando è impostato su Disabled o Automatic, le maglie di risoluzione inferiore non verranno visualizzate.
ModelStreamingMode
Controlla come Models vengono trasmessi in entrata e in uscita quando l'istanza streaming è abilitata.Il comportamento dipende dall'Enum selezionata.Non ha alcun effetto quando lo streaming non è abilitato.
Questa proprietà dovrebbe essere cambiata solo in Studio attraverso la finestra Proprietà quando lo streaming è abilitato, o in Scripts , ma mai in LocalScripts (farlo può comportare un comportamento non definito).
PrimaryPart
Punta alla parte principale del Model .La parte principale è la BasePart che funge da riferimento fisico per il punto di rotazione del modello.Cioè, quando le parti all'interno del modello vengono spostate a causa di una simulazione fisica o di altri mezzi, il punto di rotazione si muoverà in sincronia con la parte principale.
Nota che Models non hanno PrimaryPart impostato per impostazione predefinita.Se stai creando un modello che deve essere agito dalla fisica, dovresti impostare manualmente questa proprietà in Studio o all'interno di uno script.Se la parte principale è non impostata, il punto pivote rimarrà nello stesso luogo nello spazio del mondo, anche se le parti all'interno del modello vengono spostate.
Si noti inoltre che quando si imposta questa proprietà, deve essere un BasePart che è un discendente del modello.Se tenti di impostare Model.PrimaryPart a un BasePart che è non un discendente del modello, verrà impostato a quella parte ma verrà ripristinato a nil durante il prossimo passo di simulazione — questo è il comportamento legacy per supportare gli script che suppongono di poter temporaneamente impostare la parte principale su un BasePart che non è un discendente del modello.
La regola generale per i modelli è che:
- I modelli i cui pezzi sono uniti tramite articolazioni fisiche come WeldConstraints o Motor6Ds dovrebbero avere una parte primaria assegnata.Ad esempio, i modelli di personaggio Roblox hanno il loro Model.PrimaryPart impostato per impostazione predefinita al HumanoidRootPart .
- Modelli statici (solitamente Anchored ) che rimangono in un luogo a meno che uno script non li sposti esplicitamente non richiedono un Model.PrimaryPart e tendono a non beneficiare di avere un set.
Campioni di codice
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
Impostare questa proprietà nella finestra Proprietà ridimensionerà il modello come se Model/ScaleTo fosse stato chiamato su di esso, ridimensionando tutte le istanze discendenti nel modello, come materiali, immagini e la geometria 3D delle parti, in modo che il modello abbia il fattore di ridimensionamento specificato rispetto alla sua dimensione originale.
Questa proprietà è disponibile solo in Studio e lancerà un errore se utilizzata in un Script o LocalScript .Model/ScaleTo e Model/GetScale devono essere utilizzati dagli script.
WorldPivot
Questa proprietà determina dove si trova il punto di rotazione di un che non ha un set impostato.Se il Model fa ha un PrimaryPart , il punto di rotazione del Model è uguale al punto di rotazione di quella parte primaria invece, e questa proprietà WorldPivot viene ignorata.
Per un nuovamente creato Model , il suo asse sarà trattato come il centro della scatola di confine dei suoi contenuti fino a quando la prima volta la sua proprietà Model.WorldPivot non viene impostata.Una volta che il punto di rotazione del mondo viene impostato per la prima volta, è impossibile ripristinare questo comportamento iniziale.
Più comunemente, spostare il modello con gli strumenti di Studio, o con le funzioni di spostamento del modello come PVInstance:PivotTo() e Model:MoveTo(), imposterà il punto di rotazione mondiale e quindi porrà fine a questo nuovo comportamento del modello.
Lo scopo di questo comportamento è consentire al codice Luau di ottenere un punto di rotazione sensibile semplicemente creando un nuovo modello e genitori ad esso, evitando la necessità di impostare esplicitamente Model.WorldPivot ogni volta che crei un modello in codice.
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"
Campioni di codice
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)
Metodi
AddPersistentPlayer
Imposta questo modello per essere persistente per il giocatore specificato.I modelli persistenti rimangono presenti per il giocatore indipendentemente dalle impostazioni o dalle condizioni di streaming.
ModelStreamingMode deve essere impostato su PersistentPerPlayer perché il comportamento venga modificato come risultato dell'aggiunta.
Parametri
Restituzioni
GetBoundingBox
Questa funzione restituisce una descrizione di un volume che contiene tutti i BasePart figli all'interno di un Model .L'orientamento del volume è basato sull'orientamento del PrimaryPart , e corrisponde alla casella di selezione rendita in Studio quando il modello viene selezionato.Riflettendo il comportamento di Terrain:FillBlock() , restituisce un CFrame che rappresenta il centro di quella scatola di confine e un Vector3 che rappresenta le sue dimensioni.
Se non c'è PrimaryPart per il modello, la scatola di confezionamento sarà allineata agli assi del mondo.
local Workspace = game:GetService("Workspace")local model = Workspace.Modellocal part = Workspace.Partlocal orientation, size = model:GetBoundingBox()-- Ridimensiona e posiziona la parte uguale alla scatola di confezione del modellopart.Size = sizepart.CFrame = orientation
Restituzioni
GetExtentsSize
Restituisce la dimensione della più piccola scatola di confine che contiene tutto il BaseParts nel Model .Se Model.PrimaryPart esiste allora la scatola di confezionamento verrà allineata a quella parte.Se una parte primaria non è stata impostata, la funzione sceglierà una parte nel modello per allineare la scatola di confezionamento.Poiché la selezione di questa parte non è deterministica, si consiglia di impostare un Model.PrimaryPart per ottenere risultati coerenti con questa funzione.
Nota che questa funzione restituisce solo la dimensione della più piccola scatola di confine e lo sviluppatore deve impiegare il proprio metodo per ottenere la posizione della scatola di confine.
Restituzioni
Campioni di codice
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 questo metodo viene chiamato da un Script , restituisce tutti gli oggetti Player persistenti per cui questo modello è persistente.Quando viene chiamato da un LocalScript , questo metodo controlla solo se questo modello è persistente per il LocalPlayer .
Restituzioni
Un tavolo con tutti gli oggetti Player per cui questo oggetto modello è persistente.
GetScale
I modelli contengono un fattore di scala canonico persistente, che inizia a 1 per i modelli appena creati e cambia quando il modello viene scalato chiamando Model/ScaleTo .Questa funzione restituisce il fattore di scala canonico attuale del modello.
Il fattore di scala attuale non ha direttamente un impatto sulle dimensioni delle istanze sotto il modello.Viene utilizzato per scopi di creazione di contenuti e scripting per ricordare come il modello è stato ridimensionato rispetto alle sue dimensioni originali.
All'interno di una sessione data, il modello memorizza le informazioni precise sulle dimensioni originali delle istanze discendenti dopo la prima chiamata Model/ScaleTo .Questo significa che chiamare ScaleTo(x) seguita da ScaleTo(1) ti restituirà esattamente la configurazione originale del modello senza drift di punto fluttuante.Evitare il drift del punto fluttuante è la motivazione per avere una funzione Scale A invece di una funzione Scale By .
Il fattore di scala ha un impatto sul comportamento del motore in un modo: il fattore di scala di un modello verrà applicato agli spostamenti congiunti di animations giocati su un AnimationController sotto quel modello, in modo che le animazioni animate verranno riprodotte correttamente anche quando ridimensionate.
Restituzioni
Il fattore di scala canonico attuale del modello.
Campioni di codice
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
Sposta il PrimaryPart a la posizione data.Se una parte primaria non è stata specificata, verrà utilizzata la parte radice del modello, ma la parte radice non è deterministica e si consiglia di impostare sempre una parte primaria quando si utilizza MoveTo() .
Se ci sono qualsiasi ostrazione in cui il modello deve essere spostato, come Terrain o altro BaseParts, il modello verrà spostato verticalmente verso l'alto fino a quando non ci sarà nulla in arrivo.Se questo comportamento non è desiderato, PVInstance:PivotTo() dovrebbe essere utilizzato invece.
Si noti che la rotazione non viene preservata quando si sposta un modello con MoveTo() .Si consiglia di utilizzare TranslateBy() o PVInstance:PivotTo() se la rotazione attuale del modello deve essere preservata.
Parametri
Restituzioni
Campioni di codice
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)
RemovePersistentPlayer
Rende questo modello non più persistente per il giocatore specificato.Questo non garantisce che il modello verrà immediatamente rimosso per il giocatore; dopo aver chiamato questo metodo, il modello verrà trattato come Atomic per quel giocatore e rimarrà presente finché è all'interno del raggio di streaming target.
ModelStreamingMode deve essere impostato su PersistentPerPlayer perché il comportamento venga modificato come risultato della rimozione.
Parametri
Restituzioni
ScaleTo
I modelli contengono un fattore di scala canonico persistente, che inizia a 1 per i modelli appena creati.Questa funzione scala il modello, intorno alla posizione di rotazione, rispetto a come apparirebbe con un fattore di scala di 1.Per raggiungere questo obiettivo esegue due cose:
- Imposta il fattore di scala attuale del modello al valore specificato
- Ridimensiona e riposiziona tutte le istanze discendenti di conseguenza
La ridimensionamento delle posizioni viene eseguito intorno alla posizione di rotazione.
Tutte le proprietà "geometriche" delle istanze discendenti verranno ridimensionate.Questo ovviamente include le dimensioni delle parti, ma qui ci sono alcuni altri esempi di proprietà che sono ridimensionate:
- La lunghezza delle giunte come WeldConstraints , e Class.Rope|Ropes
- Velocità e forze fisiche come Hinge.MaxServoTorque
- Proprietà visive come le dimensioni dei diffusori di particelle
- Altre proprietà di lunghezza come Sound.RollOffMinDistance
Parametri
Restituzioni
TranslateBy
Sposta un Model con lo spostamento dato Vector3 , preservando l'orientamento del modello.Se un altro BasePart o Terrain esiste già nella nuova posizione allora il Model sovrapporrà l'oggetto dichiarato.
La traduzione viene applicata nello spazio del mondo piuttosto che nello spazio dell'oggetto, il che significa che anche se le parti del modello sono orientate in modo diverso si muoveranno ancora lungo l'asse standard.
Parametri
Restituzioni
Campioni di codice
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)