Model

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Modele są obiektami pojemników, co oznacza, że grupują przedmioty razem.Najlepiej używać ich do przechowywania kolekcji BaseParts i mają wiele funkcji, które rozszerzają ich funkcjonalność.

Modele mają reprezentować geometryczne grupy.Jeśli twoja grupacja nie ma interpretacji geometrycznej, na przykład kolekcja Scripts, użyj Folder zamiast tego.

Modele, których części składowe są połączone za pomocą stawów (aby mogły się poruszać lub zostać zniszczone za pomocą symulacji fizycznej), zwykle mają ustawiaćPrimaryPart, ponieważ określa, która część modelu będzie "obserwować" za modelem, gdy się porusza.Statyczne modele, które pozostają w jednym miejscu, nie korzystają z posiadania zestawu części ustawiać.

Modele mają szeroką gamę zastosowań, w tym postacie graczy Roblox.Mają one również szereg unikalnych zachowań, które należy wziąć pod uwagę:

Podobnie jak w przypadku wszystkich typów Instance rodzice, fakt, że rodzic Model zostanie replikowany do klienta, nie gwarantuje, że wszystkie jego dzieci zostaną również replikowane.Jest to szczególnie ważne, jeśli instancje te są uzyskiwane przez kod uruchamiany na klientzie, tak jak w przypadku LocalScript .Użycie ModelStreamingMode z wartościami takimi jak Atomic może zapewnić, że cała model i wszystkie jego potomki są obecne, jeśli model rodzic istnieje na klientzie, lub możesz użyć WaitForChild() gdy nie chcesz, aby atomowość była pożądana.

Przykłady kodu

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)

Podsumowanie

Właściwości

  • Zabezpieczenia dodatku plug-in
    Odczyt równoległy

    Ustawia poziom szczegółowości na modelu dla doświadczeń z włączonym strumieniem instancji.

  • Kontroluje zachowanie przesyłania modelu na Models gdy włączono przesyłanie instancji.

  • Odczyt równoległy

    Główna część Model lub nil jeśli nie jest wyraźnie ustawiać.

  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy

    Własność tylko dla edytora używana do skalowania modelu wokół jego osi. Ustawienie tej właściwości przeniesie skalę tak, jakby Model/ScaleTo została wezwana na niej.

  • Bez replikacji
    Odczyt równoległy

    Określa, gdzie znajduje się osiować punkt obrotowy , który nie ma ustawionego zestawu.

Właściwości odziedziczeni z: PVInstance
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy

Metody

  • AddPersistentPlayer(playerInstance : Player):()

    Ustawia ten model, aby był trwały dla określonego gracza.Model.ModelStreamingMode musi zostać ustawione na PersistentPerPlayer , aby zachowanie zostało zmienione w wyniku dodania.

  • Zwraca opis woluminu, który zawiera wszystkie części modelu.

  • Zwraca rozmiar najmniejszego pudełka ograniczającego, które zawiera wszystkie BaseParts w Model, zgodnie z Model.PrimaryPart, jeśli jest ustawiać.

  • Zwraca wszystkie obiekty Player , które ten obiekt modelowy jest trwały dla.Zachowanie różni się w zależności od tego, czy metoda ta jest wywoływana z Script lub LocalScript.

  • Zwraca kanoniczną skalę modelu, która domyślnie wynosi 1 dla nowo utworzonych modeli i zmieni się, gdy zostanie skalowana za pomocą Model/ScaleTo.

  • MoveTo(position : Vector3):()

    Przesuwa PrimaryPart do określonej pozycji. Jeśli nie zaznaczono głównej części, zostanie użyta część korzenna modelu.

  • RemovePersistentPlayer(playerInstance : Player):()

    Sprawia, że ten model nie jest już trwały dla określonego gracza.Model.ModelStreamingMode musi zostać ustawione na PersistentPerPlayer , aby zachowanie zostało zmienione w wyniku usunięcia.

  • ScaleTo(newScaleFactor : number):()

    Ustawia czynnik skali modelu, dostosowując rozmiar i lokalizację wszystkich potomnych instancji tak, aby miały ten czynnik skali w stosunku do ich początkowych rozmiarów i lokalizacji, gdy czynnik skali wynosił 1.

  • TranslateBy(delta : Vector3):()

    Przesuwa Model przez podany odległość Vector3, zachowując orientację modelu.Jeśli istnieje już inny BasePart lub Terrain w nowej pozycji, wtedy Model pokryje powiedziany obiekt.

Metody odziedziczeni z: PVInstance

Właściwości

Zabezpieczenia dodatku plug-in
Odczyt równoległy

Ustawia poziom szczegółowości na modelu dla doświadczeń z instancją streamingową włączoną.

Gdy ustawiono na StreamingMesh , niższa rozdzielczość siatki "impostera" (kolorowa, gruba siatka, która owija wszystkie części dziecka modelu) renderuje się poza zasięgiem strumienia.

Gdy ustawiono na Disabled lub Automatic, niższa rozdzielczość siatek nie będzie wyświetlana.

ModelStreamingMode

Odczyt równoległy

Kontroluje, w jaki sposób Models są przesyłane i odbierane, gdy włączono transmisję instancji streamingowej.Zachowanie zależy od wybranego enum.Nie ma wpływu, gdy transmisja nie jest włączona.

Właściwość ta powinna być zmieniana w Studio za pośrednictwem okna Właściwości tylko w przypadku włączenia transmisji, lub w Scripts , ale nigdy w LocalScripts (czyniąc tak można doprowadzić do niedefiniowanego zachowania).

PrimaryPart

Odczyt równoległy

Wskazuje na główną część Model .Główną częścią jest BasePart, która działa jako odniesienie fizyczne dla osi obrotu modelu.Oznacza to, że kiedy części w modelu są przenoszone z powodu symulacji fizycznej lub innych środków, osie będą się poruszać w zgodzie z główną częścią.

Zauważ, że Models nie ma domyślnie ustawionego PrimaryPart .Jeśli tworzysz model, który musi być działany przez fizykę, powinieneś ręcznie ustawić tę właściwość w Studio lub w skrypcie.Jeśli część główna jest nie ustawiać, pivot pozostanie w tym samym miejscu w przestrzeni świata, nawet jeśli części w modelu zostaną przeniesione.

Zauważ też, że podczas ustawiania tej właściwości musi to być BasePart że jest potomkiem modelu.Jeśli próbujesz ustawić na , które jest nie potomkiem modelu, zostanie ustawione do tej części, ale zostanie zresetowane podczas następnego kroku symulacji — jest to starsze zachowanie wspierające skrypty, które domniemają, że mogą tymczasowo ustawić główną część na , która nie jest potomkiem modelu.

Ogólną zasadą dla modeli jest to:

  • Modele, których części są połączone za pomocą fizycznych połączeń, takich jak WeldConstraints lub Motor6Ds, powinny mieć przypisany główny element.Na przykład modele postaci Roblox mają domyślnie ustawione Model.PrimaryPart do HumanoidRootPart .
  • Statyczne (zwykle Anchored ) modele, które pozostają w jednym miejscu, chyba że skrypt wyraźnie je przeniesie, nie wymagają Model.PrimaryPart i nie mają tendencji do korzystania z jednego ustawiać.

Przykłady kodu

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

Bez replikacji
Brak możliwości dodawania do skryptu
Odczyt równoległy

Ustawienie tej właściwości w oknie właściwości rozmiaru zmniejszy model tak, jakby Model/ScaleTo został wezwany na nim, skalując wszystkie potomne instancje w modelu tak, aby model miał określony czynnik skali względem swojego pierwotnego rozmiaru.

Właściwość ta jest dostępna tylko w Studio i wyświetli błąd, jeśli zostanie użyta w Script lub LocalScript.Model/ScaleTo i Model/GetScale powinny być używane z skryptów.

WorldPivot

Bez replikacji
Odczyt równoległy

Właściwość ta określa, gdzie znajduje się osień , który nie ma ustawionego nie zestawu .Jeśli ma , punkt obrotowy tej podstawowej części jest równy punktowi obrotowemu tej podstawowej części zamiast tego, a ta właściwość jest ignorowana.

Dla nowo utworzonego Model jego osi będzie traktowany jako centrum pudełka zakresu jego zawartości, dopóki po raz pierwszy nie zostanie ustawiaćjego właściwość Model.WorldPivot.Gdy światowy pivot zostanie ustawiony po raz pierwszy, nie można przywrócić tego początkowego zachowania.

Najczęściej przenoszenie modelu za pomocą narzędzi Studio lub za pomocą funkcji przenoszenia modelu, takich jak PVInstance:PivotTo() i Model:MoveTo(), ustawi pivot świata i zakończy tym nowe zachowanie modelu.

Celem tego zachowania jest umożliwienie kodowi Luau uzyskania rozsądnego pivotu po prostu poprzez utworzenie nowego modelu i przypisanie mu obiektów, unikając potrzeby wyraźnego ustawienia każdym razem, gdy tworzysz model w kodzie.


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"

Przykłady kodu

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)

Metody

AddPersistentPlayer

()

Parametry

playerInstance: Player
Wartość domyślna: "nil"

Zwroty

()

GetBoundingBox

Funkcja ta zwraca opis woluminu, który zawiera wszystkie BasePart dzieci wewnątrz Model .Orientacja głośności opiera się na orientacji PrimaryPart i pasuje do pola wyboru renderowanego w Studio, gdy model jest wybrany.Odbijając zachowanie Terrain:FillBlock(), zwraca CFrame reprezentujące centrum tej ramki i Vector3 reprezentujące jej rozmiar.

Jeśli nie ma PrimaryPart dla modelu, pudełko granicowe zostanie wyśrodkowane w osiach świata.


local Workspace = game:GetService("Workspace")
local model = Workspace.Model
local part = Workspace.Part
local orientation, size = model:GetBoundingBox()
-- Zmień rozmiar i pozycję części równej obudowie pudełka modelu
part.Size = size
part.CFrame = orientation

Zwroty

A CFrame reprezentująca orientację objętości połączoną z Vector3 reprezentującą rozmiar objętości.

GetExtentsSize

Zwraca rozmiar najmniejszego pudełka ograniczającego, które zawiera całe BaseParts w Model.Jeśli Model.PrimaryPart istnieje, to pudełko graniczne zostanie wyśrodkowane w tej części.Jeśli część główna nie została ustawiona, funkcja wybierze część w modelu, do której dostosuje pudełko granicowe.Ponieważ wybór tej części nie jest deterministyczny, zaleca się ustawienie Model.PrimaryPart, aby uzyskać spójne wyniki z tą funkcją.

Zauważ, że ta funkcja zwraca tylko rozmiar najmniejszego pudełka granicznego, a programista musi wykorzystać własną metodę, aby uzyskać pozycję pudełka granicznego.


Zwroty

Rozmiar Vector3 rozszerzeń Model .

Przykłady kodu

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

Gdy ta metoda jest wywoływana z Script, zwraca wszystkie obiekty Player, które są trwałe dla tego modelu.Gdy jest wezwany z LocalScript, ta metoda sprawdza tylko, czy ten model jest trwały dla LocalPlayer.


Zwroty

Instances

Tabela ze wszystkimi Player obiektami, które ten obiekt modelowy jest trwały dla.

GetScale

Modele zawierają trwały skalarny czynnik skali, który zaczyna się od 1 dla nowo utworzonych modeli i zmienia się, gdy model jest skalowany za pomocą wezwania Model/ScaleTo.Funkcja ta zwraca obecny skalarny czynnik skali modelu.

Obecny czynnik skali nie ma bezpośredniego wpływu na rozmiar instancji w ramach modelu bezpośrednio.Służy do celów pisania treści i skryptowania, aby zapamiętać, jak model został skalowany w stosunku do jego pierwotnego rozmiaru.

W ramach danej sesjamodel zapamięta dokładne informacje o pierwotnym rozmiarze odpowiednich Instancji potomnych po pierwszym wezwaniu Model/ScaleTo.Oznacza to, że wezwanie ScaleTo(x) połączone z ScaleTo(1) otrzyma cię powrót dokładnie oryginalnej konfiguracji modelu bez przepięć punktów zmienionych.Unikanie drgań punktów zwrotnych jest motywem posiadania funkcji Skala Do zamiast funkcji Skala Przez .

Czynnik skali wpływa na zachowanie silnika w jeden sposób: czynnik skali modelu zostanie zastosowany do wspólnych odległości odtwarzanych na podstawie tego modelu, tak aby animowane rygły prawidłowo odtwarzały animacje nawet po skalowaniu.


Zwroty

Obecny czynnik skali kanonicznej modelu.

Przykłady kodu

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

()

Przesuwa PrimaryPart do danej pozycji.Jeśli nie zaznaczono głównej części, zostanie użyta część korzenna modelu, ale część korzenna nie jest deterministyczna i zaleca się, aby zawsze ustawiać główną część przy użyciu MoveTo().

Jeśli wystąpią jakiekolwiek przeszkody, w których model ma być przeniesiony, takie jak Terrain lub inne BaseParts, model zostanie przesunięty w górę wzdłuż osi pionowej, dopóki nie będzie nic na drodze.Jeśli zachowanie to nie jest pożądane, należy zamiast tego użyć PVInstance:PivotTo().

Zauważ, że rotacja nie jest zachowana przy przesuwaniu modelu za pomocą MoveTo().Zaleca się użycie TranslateBy() lub PVInstance:PivotTo(), jeśli obecna rotacja modelu musi zostać zachowana.

Parametry

position: Vector3

The Vector3 the Model jest przenoszony do.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Parametry

playerInstance: Player
Wartość domyślna: "nil"

Zwroty

()

ScaleTo

()

Modele zawierają trwały skalarny czynnik skali, który zaczyna się od 1 dla nowo utworzonych modeli.Funkcja ta skaluje model, wokół położenia pivotowego, w stosunku do tego, jak wyglądałby przy skali wynoszącej 1.Aby to osiągnąć, robi dwie rzeczy:

  • Ustawia obecny czynnik skali modelu na określoną wartość
  • Zmienia rozmiary i przesuwa wszystkie potomne instancje odpowiednio

Skalowanie lokalizacji odbywa się wokół lokalizacji pivotowej.

Wszystkie " geometryczne " właściwości potomnych instancji zostaną skalowane.Obejmuje to oczywiście rozmiary części, ale oto kilka innych przykładów właściwości, które są skalowane:

  • Długość stawów takich jak WeldConstraints i Class.Rope|Ropes
  • Fizyczne prędkości i siły, takie jak Hinge.MaxServoTorque
  • Wizualne właściwości, takie jak rozmiary emitentów cząstek
  • Inne właściwości długości, takie jak Sound.RollOffMinDistance

Parametry

newScaleFactor: number
Wartość domyślna: ""

Zwroty

()

TranslateBy

()

Przesuwa Model przez podany odległość Vector3, zachowując orientację modelu.Jeśli istnieje już inny BasePart lub Terrain w nowej pozycji, wtedy Model pokryje powiedziany obiekt.

Tłumaczenie jest stosowane w przestrzeni świata, a nie w przestrzeni obiektów, co oznacza, że nawet jeśli części modelu są skierowane w różny sposób, nadal będą się poruszać wzdłuż standardowego osi.

Parametry

delta: Vector3

The Vector3 to przetłumaczyć Model przez.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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)

Zdarzenia