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 li raggruppano insieme. Sono la soluzione migliore per contenere collezioni di BaseParts e hanno una serie di funzioni che estendono le loro funzionalità.
I modelli sono intesi a rappresentare aggregamenti geometrica. Se il tuo gruppoing non ha un'interpretazione geometrica, ad esempio una collezione di Scripts , usa un Folder invece.
I modelli cui le parti costituenti sono congiunte con i chiodi (in modo che possano muoversi o essere distrutti tramite simulazione fisica) di solito hanno un PrimaryPart Impostare, poiché specifica quale parte nel modello il pivot e la scatola di connessione "Seguire" mentre il modello si muove. I modelli dinamici che rimangono in un posto non ne traranno beneficio di avere un Impostaredi parti primaria.
I modelli hanno un'ampia gamma di applicazioni, tra cui i personaggi dei giocatori Roblox. Hanno anche un certo numero di comportamenti unici che sono importanti da tenere a mente:
- Se la posizione di una parte sulla Y assi tocca il valore Workspace.FallenPartsDestroyHeight , e era l'ultimo oggetto all'interno di un Model , il modello sarà distrutto anche.
- Quando viene utilizzato in un luogo con Workspace.StreamingEnabled impostato su true, il valore di ModelStreamingMode controlla varie azioni intorno a come il modello e qualsiasi discendente vengono replicati e/o rimossi dai client. Inoltre, il valore di LevelOfDetail influenza la
Come con tutti i tipi Instance , il fatto che un padre Class.Model</
Campioni di codice
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 la funzione di streaming in sessione abilitata.
Controlla il comportamento di streaming del modello su Models quando è abilitato lo streaming delle istanze.
La parte principale del Model, o nil se non è esplicitamente Impostare.
Proprietà utilizzata solo dall'editor per scalare il modello intorno al suo pivot. Impostando questa proprietà sposterà lo scala come se Model/ScaleTo fosse stata chiamata su di esso.
Determina dove si trova il punto di rotazione di un Model che non ha non un set Model.PrimaryPart è posizionato.
Metodi
Imposta questo modello per essere persistente per il Giocatorespecificato. Model.ModelStreamingMode deve essere impostato su PersistentPerPlayer per il comportamento di modifica come risultato dell'aggiungimento.
Restituisce una descrizione di un volume che contiene tutte le parti di un modello.
Restituisce il valore della più piccola scatola di confezione che contiene tutti i BaseParts in the Model , allineato con il Model.PrimaryPart se è Impostare.
Restituisce tutti gli oggetti Player che questo oggetto modello è persistente. Il comportamento varia in base a se questo metodo viene chiamato da un Script o da un LocalScript .
Restituisce la scala di canone del modello, che predefinito è 1 per i nuovi modelli creati e cambierà man mano che viene scala via Model/ScaleTo .
Sposta il PrimaryPart alla posizione specificata. Se una parte primaria non è stata specificata, la parte di base del modello sarà utilizzata.
Questo modello non è più persistente per il Giocatorespecificato. Model.ModelStreamingMode deve essere impostato su PersistentPerPlayer per il comportamento di modifica come risultato della rimozione.
Imposta il fattore di escala del modello, regolando la dimensione e la posizione di tutte le istanze discendenti in modo che abbiano quel fattore di escala rispetto alle loro dimensioni e posizione iniziali quando il fattore di escala era 1.
Sposta un Model da un dato Vector3 OFFSET, preservando l'orientamento del modello. Se un altro BasePart o 1> Class.Terrain1> esiste già nella nuova posizione, allora il 4> Class.Model4> si sovrappone all'oggetto dichiarato.
Ottiene il pivot di un PVInstance .
Transforms the PVInstance along with all of its descendant PVInstances such that the pivot is now located at the specified CFrame .
Proprietà
LevelOfDetail
Imposta il livello di dettaglio sul modello per le esperienze con streaming abilitato.
Quando impostato su StreamingMesh, un mesh "imposter" di risoluzione inferiore (色ato, granulato che avvolge tutte le parti figlie del modello) rende fuori dal raggio di streaming.
Quando impostato su Disabled o Automatic, le maglie di pixelizzazione a bassa risoluzione non saranno visualizzate.
ModelStreamingMode
Controlla come Models vengono riprodotti in e out quando la riproduzione in streaming è abilitata. Il comportamento dipende dall'enum selezionato. Non ha effetto quando la riproduzione non è abilitata.
Questa proprietà dovrebbe essere modificata solo in Studio tramite la finestra Proprietà quando lo streaming è abilitato, o in Scripts , ma non in LocalScripts (fai così che può comportare comportamenti non definiti).
PrimaryPart
Punta alla parte principale del Model . La parte principale è la BasePart che agisce come riferimento fisico per il pivot del modello. Ciò significa che quando le parti nel modello vengono spostate in base a simulazione fisica o altri mezzi, il pivot si muove in sincronia con la parte principale.
Nota che Models non hanno PrimaryPart impostato per impostazione predefinita. Se stai creando un modello che richiede di essere attuato dalla fisica, devi impostare manualmente questa proprietà in Studio o all'interno di uno script. Se la parte principale non è Impostare, il pivot rimarrà allo stesso posto nello Spaziodel mondo, anche se le parti all'interno del modello vengono spostate
Nota anche che quando si imposta questa Proprietà, deve essere un BasePart che è un discendente del modello. Se provi a impostare Model.PrimaryPart su un Class.BasePart
La regola generale per i modelli è che:
- I modelli cui le parti sono connesse tramite articolazioni fisiche come WeldConstraints o Motor6Ds dovrebbero avere una parte principale assegnata. Ad esempio, i modelli dei personaggi Roblox hanno il loro Model.PrimaryPart impostato su 2>UmanoidRootPart2>
- Modelli statici (di solito Anchored ) che rimangono in un unico posto a meno che uno script non li sposti esplicitamente non richiedono un Model.PrimaryPart e tendono a beneficiare di avere un Impostare.
Campioni di codice
-- 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
Impostando questa proprietà nella finestra delle proprietà, il modello sarà ridimensionato in modo che Model/ScaleTo venga chiamato su di esso, ridimensionando tutte le istanze discendenti nel modello in modo che il modello abbia il fattore di ridimensionamento specificato rispetto alla sua dimensione originale.
Questa proprietà è disponibile solo in Studio e mostrerà un errore se usata in un Script o in un LocalScript . Model/ScaleTo e 1> Model/GetScale1> dovrebbero essere usati dagli script.
WorldPivot
Questa proprietà determina dove si trova il pilastro di un Model che non ha Class.Model.PrimaryPart impostato. Se il Model.PrimaryPart 2>Class.Model.
Per un Model appena creato, il suo pivot sarà trattato come il centro della sua scatola di contenuti fino alla prima volta Class.Model.WorldPivot sua proprietà è Impostare. Una volta che il pivot mondiale è impostato per la prima volta, è impossibile ripristinare questo comportamento iniziale.
La maggior parte delle volte, spostare il modello con gli strumenti di Studio, o con funzioni di movimento del modello come PVInstance:PivotTo() e Model:MoveTo(), imposterà l'asse del mondo e quindi porterà questo nuovo comportamento del modello.
Lo scopo di questo comportamento è consentire al codice Lua di ottenere un'impostazione sensata semplicemente creando un nuovo modello e attribuendo oggetti a esso, evitando la necessità di impostare esplicitamente Model.WorldPivot ogni volta che crei un modello in codice.
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
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
GetBoundingBox
Questa funzione restituisce una descrizione di un volume che contiene tutti BasePart figli all'interno di un Model . L'orientamento del volume è basato sull'orientamento del
Se non esiste PrimaryPart per il modello, la casella di contorno sarà allineata sugli assi mondiali.
local model = workspace.Modellocal part = workspace.Partlocal orientation, size = model:GetBoundingBox()-- Ridimensiona e posiziona la parte uguale alla scatola di contorno del modellopart.Size = sizepart.CFrame = orientation
Restituzioni
GetExtentsSize
Restituisce il valore della più piccola scatola di legame che contiene tutti i BaseParts in Model . Se Model.PrimaryPart esiste, allora la scatola di legame sarà allineata su quella parte. Se
Nota che questa funzione restituisce solo la dimensione della più piccola Quadro di selezionedi connessione, e lo sviluppatore deve impiegare il proprio metodo per ottenere la posizione della casella di Quadro di selezione.
Restituzioni
Campioni di codice
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 che questo modello è persistente per. Quando viene chiamato da un LocalScript , questo metodo controlla solo se questo modello è persistente per il 2>Class.Players.LocalPlayer|LocalPlayer2> .
Restituzioni
Una tabella con tutti gli oggetti Player per cui questo oggetto modello è persistente.
GetScale
I modelli contengono un fattore di scala persistente, che inizia con 1 per i modelli appena creati e cambia man mano che il modello viene scalato chiamando Model/ScaleTo . Questa funzione restituisce il fattore di scala persistente del modello.
Il fattore di dimensioni attuale non colpisce direttamente la dimensione delle istanze sotto il modello. Viene utilizzato per scopi di autorizzazione e scripting per ricordare come il modello è stato scala rispetto alla sua dimensione originale.
All'interno di una Sessionespecifica, il modello memorizzerà le informazioni originali precise della dimensione discendente delle istanze dopo la prima chiamata Model/ScaleTo . Ciò significa che chiamando ScaleTo(x) seguita da ScaleTo(1)</
Il fattore di escala influenza il comportamento del motore in un modo: il fattore di escala di un modello sarà applicato alle偏enze congiunte di animations giocato su un AnimationController sotto quel modello, in modo che le rig animate possano riprodurre le animazioni in modo corretto anche quando sono ingrandite.
Restituzioni
Il fattore di scala canonica attuale del modello.
Campioni di codice
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 alla posizione specificata. Se una parte primaria non è stata specificata, la parte di radice del modello sarà utilizzata, ma la parte di radice non è deterministica e si consiglia di impostare sempre una parte primaria quando si utilizza MoveTo() .
Se ci sono delle limitazioni in cui il modello deve essere spostato, come Terrain o altri BaseParts, il modello sarà spostato verticalmente fino a quando non ci sarà nulla in modo. Se questo comportamento non è desiderato, PVInstance:PivotTo() dovrebbe essere utilizzato invece.
Nota che la rotazione non viene preservata quando si muove un modello con MoveTo() . È consigliato utilizzare either TranslateBy() o PVInstance:PivotTo() se la rotazione attuale del modello deve essere preservata.
Parametri
Restituzioni
Campioni di codice
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
I modelli contengono un fattore di scala persistente, che inizia con 1 per i modelli appena creati. Questa funzione scala il modello, intorno alla posizione di pivot, rispetto a come apparirebbe un fattore di scala di 1. Per raggiungerlo, fa due cose:
- Imposta il fattore di escala corrente del modello sul valore specificato
- Ridimensiona e riposiziona le istanze discendenti di conseguenza
Lo scaling delle posizioni viene eseguito intorno alla posizione di pivot.
Tutte le proprietà "geometriche" delle istanze discendenti saranno ingrandite. Questo ovviamente include le dimensioni delle parti, ma qui ci sono alcuni altri esempi di proprietà che sono ingrandite:
- La lunghezza delle giunte come WeldConstraints e Class.Rope|Ropes
- Velocità e forze fisiche come Hinge.MaxServoTorque
- Proprietà visive come le dimensioni degli emitter di parti
- Altre proprietà di lunghezza come Sound.RollOffMinDistance
Parametri
Restituzioni
TranslateBy
Sposta un Model da un dato Vector3 OFFSET, preservando l'orientamento del modello. Se un altro BasePart o 1> Class.Terrain1> esiste già nella nuova posizione, allora il 4> Class.Model4> si sovrappone all'oggetto dichiarato.
La traduzione viene applicata nello spazio del mondo piuttosto che nello Spaziodell'oggetto, il che significa che anche se le parti del modello sono orientate in modo diverso, si muoveranno comunque lungo l'asse standard.
Parametri
Restituzioni
Campioni di codice
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)