Model
*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.
Modeli są obiektami kontenerowymi, co oznacza, że zbierają one obiekty razem. Są one najlepiej używane do przechowywania zbiorów BaseParts i mają wiele funkcji, które rozszerzają ich funkcjonalność.
Modele są przeznaczone do przedstawienia geometrycznych grupowań. Jeśli twój grup nie ma geometrycznej interpretacji, na przykład zbiór Scripts , użyj Folder zamiast tego.
Modele, których części są połączone ze sobą za pomocą łączników (tak, aby mogły się poruszać lub być zniszczone poprzez symulację fizyczną), zwykle mają PrimaryPart ustawiać, ponieważ określa, która część w modelu będzie "obserwować" za modelem, gdy model się porusza. Styczne modele, które pozostają w jednym miejscu
Modele mają szeroką gamę zastosowań, w tym postacie graczy Roblox. Mają również wiele unikalnych zachowań, które są ważne do pamiętania:
- Jeśli pozycja części na osi Y dotyka wartości Workspace.FallenPartsDestroyHeight i była to ostatnia obiekt w Model, model zostanie również zniszczony.
- Gdy używany w miejscu z ustawionym Workspace.StreamingEnabled na prawdę, wartość ModelStreamingMode kontroluje różne zachowania wokół tego, jak model i dowodowania są replikowane i/lub usuwane z klientów. Ponadto wartość LevelOfDetail
Podobnie jak w przypadku wszystkich rodzajów Instance , rodzaj Class.
Przykłady kodu
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
Ustawia poziom szczegółowości na modelu dla doświadczeń z włączonym przesyłaniem instancji.
Kontroluje zachowanie przesyłania modelu na Models , gdy jest włączone przesyłanie instancji.
Główna część Model lub nil jeśli nie jest wyraźnie ustawiać.
Własność tylko dla edytora używana do skalowania modelu wokół jego osi. Ustawienie tej własności przeniesie skalę, tak jakby Model/ScaleTo zostało na nią wezwane.
Określa, gdzie pivot a Model , który nie ma nie ma zestawu Model.PrimaryPart jest położony.
Metody
Ustawia ten model na trwały dla określonego gracza. Model.ModelStreamingMode musi być ustawiony na PersistentPerPlayer , aby zachować zachowanie w wyniku dodania.
Opisuje poziom, który zawiera wszystkie części Modelu.
Zwraca rozmiar najmniejszego pola granicznego, które zawiera wszystkie BaseParts w Model, zgodnie z Model.PrimaryPart ustawionym, jeśli jest ustawiać.
Wróщает wszystkie obiekty Player, które ten obiekt modelu jest trwały. Zachowanie się zmienia w zależności od tego, czy ten metodowy jest wezwany z Script lub LocalScript.
Zwraca skalę kanoniczną modelu, która domyślnie wynosi 1 dla nowo utworzonych modeli i będzie się zmieniać w miarę skalowania poprzez Model/ScaleTo.
Przenieś PrimaryPart do określonej pozycji. Jeśli główna część nie została określona, zostanie użyta część korzeni modelu.
Nie czyni tego modelu już trwałym dla określonego gracza. Model.ModelStreamingMode musi być ustawiony na PersistentPerPlayer , aby zachować zachowanie w wyniku usunięcia.
Ustawia czynnik skalowania modelu, dostosowując rozmiar i lokalizację wszystkich potomnych Instancji, aby miały ten czynnik skalowania w stosunku do ich początkowych rozmiarów i lokalizacji, gdy czynnik skalowania był 1.
Przesunięty Model przez podany Vector3 OFFSET, zachowując orientację modelu. Jeśli kolejny BasePart lub 1> Class.Terrain1> już istnieje w nowej pozycji, to 4> Class.Model4> będzie się łączyć z powyższym obiektem.
Zdobadza pivot Class.PVInstance .
Transformuje PVInstance wraz z wszystkimi jego potomnymi PVInstances, tak aby pivot teraz znajdował się w CFrame .
Właściwości
LevelOfDetail
Ustawia poziom szczegółowości na modelu dla doświadczeń z włączonym streamingu .
Gdy ustawiony na StreamingMesh, niższa rozdzielczość "imposter" sieci (oklejona kolorami, gęstą siecią, która otula wszystkie dzieci części modelu) renderuje się poza obszarem przesyłania.
Gdy ustawiony na Disabled lub Automatic, niższa rozdzielczość siatek nie będzie wyświetlana.
ModelStreamingMode
Kontroluje, jak Models są przetwarzane w i wychodzą, gdy instancja streamingu jest włączona. Zachowanie zależy od wybranego listy. Nie ma efektu, gdy przetwarzanie nie jest włączone.
Ta właściwość powinna być zmieniana tylko w Studio za pośrednictwem okna Właściwości , gdy jest włączone transmisja, lub w Scripts , ale nigdy w LocalScripts (co może powodować niezdefiniowane zachowanie).
PrimaryPart
Wskazuje na główną część Model . Główną częścią jest BasePart, która działa jako referencja fizyczna dla pivotu modelu. To jest, gdy części w modelu są przesuwane z powodu fizycznej simulacji lub innych środków, pivot będzie się zmieniać w zgodzie z główną częścią.
Uwaga, że Models nie ma PrimaryPart ustawiony domyślnie. Jeśli tworzysz model, który wymaga zachowania przez fizykę, powinieneś ręcznie ustawić tę właściwość w Studio lub w środku skryptu. Jeśli część główna nie jest ustawiać, pivot pozostanie w tym samym lokalizacji w przestrzeni kosmicznej, nawet
Uwaga: przy ustawieniu tej właściwości musi być BasePart, które jest potomstwem modelu. Jeśli próbujesz ustawić Model.PrimaryPart na
Generałem zasadą dla modeli jest to:
- Modele, których części są połączone ze sobą za pośrednictwem łączników fizycznych, takich jak WeldConstraints lub Motor6Ds, powinny mieć przypisaną podstawową część. Na przykład, modele postaci Roblox mają swoje Model.PrimaryPart ustawione na
- Statyczne modele (zwykle Anchored), które pozostają w jednym miejscu, chyba że skrypt wyraźnie je przesunie, nie wymagają Model.PrimaryPart i prawdopodobnie nie korzystają z posiadania jednego ustawiać.
Przykłady kodu
-- 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
Ustawienie tego właściwości w oknie właściwości skali modelu, tak jakby Model/ScaleTo była na nim wezwana, skaluje cały jego potomny Instancje w modelu, aby model miał określony czynnik skalowania w stosunku do jego oryginalnego rozmiaru.
Ta właściwość jest dostępna tylko w Studio i wyśle błąd, jeśli zostanie użyta w Script lub LocalScript . Model/ScaleTo i 1> Model/GetScale1> powinny być używane z skryptów.
WorldPivot
To właściwość określa, gdzie pivot of a Model , który nie ma nie ma ustawionej Model.PrimaryPart jest położony
Dla nowo utworzonego Model jego pivot będzie traktowany jako centrum ramy wyboru jego zawartości do czasu ustawienia pierwszy raz jego właściwości Model.WorldPivot. Po ustawieniu pivotu świata po raz pierwszy nie jest możliwe przywrócenie tego pierwotnego zachowania.
Najczęściej, przesuwając model za pomocą narzędzi Studio lub z funkcjami przesuwania modelu, takimi jak PVInstance:PivotTo() i Model:MoveTo(), ustawisz światowy pivot i tym samym zakończysz to nowe zachowanie modelu.
Celem tego zachowania jest umożliwienie Lua kodu, aby uzyskać rozsądny pivot, po prostu poprzez stworzenie nowego modelu i przywiązanie obiektów do niego, unikając potrzeby ustawienia Model.WorldPivot każdym razem, gdy tworzysz model w kodzie.
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"
Przykłady kodu
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
GetBoundingBox
Funkcja ta zwraca opis głośnicy, która zawiera wszystkie BasePart dzieci w Model . Orientacja głośnicy jest oparta na orientacji
Jeśli nie ma PrimaryPart dla modelu, kształtowanie pudełka granicznego będzie zgodne z wymiarami świata.
local model = workspace.Modellocal part = workspace.Partlocal orientation, size = model:GetBoundingBox()-- Zmień rozmiar i pozycję części równą kształtującemu się pudełku modelupart.Size = sizepart.CFrame = orientation
Zwroty
GetExtentsSize
Zwraca rozmiar najmniejszego pola granicznego, które zawiera wszystkie BaseParts w Model. Jeśli istnieje Model.PrimaryPart, to pola graniczne zostaną dostosowane do tej części.
Uwaga ta funkcja tylko zwraca rozmiar najmniejszego pola granicznego, a rozwój musi użyć własnej metody, aby uzyskać pozycję pola granicznego.
Zwroty
Przykłady kodu
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
Gdy ten metodowy jest wezwany z Script , zwraca wszystkie obiekty Player, które ten model jest trwały. Gdy jest wezwany z LocalScript, ten metodowy sprawdza tylko, czy ten model jest trwały dla 2>Class.Players.LocalPlayer|LocalPlayer2>.
Zwroty
Tabela z wszystkimi Player obiektami, dla których ten model obiektu jest trwały.
GetScale
Modeli zawiera trwały skalator kanoniczny, który zaczyna się od 1 dla nowo utworzonych modeli i zmienia się, gdy skala modelu jest skalowana poprzez wezwanie Model/ScaleTo. Ta funkcja zwraca obecny skalator kanoniczny modelu.
Obecny czynnik skalowania nie wpływa bezpośrednio na rozmiar Instancji pod modeliem. Jest używany do celów autorstwa treści i skryptów, aby pamiętać, jak skala modelu względem jego oryginalnego rozmiaru.
W ramach danej sesjamodel będzie przechowywał dokładne informacje o pierwotnej wielkości instancji potomstwa po pierwszym wezwaniu Model/ScaleTo. Oznacza to, że po wzywaniu ScaleTo(x) następującego przez
Faktor skalowania wpływa na zachowanie silnika w jeden sposób: Faktor skalowania modelu zostanie zastosowany do wspólnych odległości od Class.Animation|animacji grających na AnimationController pod tym modelem, aby animowane rury grały poprawnie nawet po skalowaniu.
Zwroty
Aktualny czynnik skali kanonicznej modelu.
Przykłady kodu
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
Przenieś PrimaryPart do określonej pozycji. Jeśli część główna nie została określona, to część korzenna modelu zostanie użyta, ale część główna nie jest deterministyczna i zaleca się, aby zawsze ustawić główną część, gdy używasz MoveTo() .
Jeśli istnieją jakiekolwiek ograniczenia, w których model ma być przesunięty, takie jak Terrain lub inne BaseParts, model zostanie przesunięty w górę w kierunku, aż nie będzie nic na drodze. Jeśli tego nie chcesz, użyj PVInstance:PivotTo() zamiast tego.
Uwaga, że rotacja nie jest zachowywana, gdy przesuwasz model z MoveTo() . Rozwiązanie jest zalecane, aby użyć TranslateBy() lub PVInstance:PivotTo() , jeśli obecna rotacja modelu musi być zachowana.
Parametry
Zwroty
Przykłady kodu
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
Modele zawierają trwały skalator kanoniczny, który zaczyna się od 1 dla nowo utworzonych modeli. Ta funkcja skaluje model, wokół lokalizacji pivot, w odniesieniu do tego, jak wygląda na skalatorze 1. Aby to osiągnąć, robi dwa rzeczy:
- Ustawia obecny czynnik skalowania modelu na określony wartość
- Zmienia rozmiar i pozycje wszystkich potomnych instancji zgodnie
Skalowanie lokalizacji jest wykonane wokół lokalizacji pivot.
Wszystkie właściwości "geometryczne" potomnych Instancji zostaną skalowane. To oczywiście obejmuje rozmiary części, ale tutaj są inne przykłady właściwości, które są skalowane:
- Długość łączeń, takich jak WeldConstraints i Class.Rope|Ropes
- Fizyczne prędkości i siły, takie jak Hinge.MaxServoTorque
- Właściwości wizualne, takie jak rozmiar emisji cząsteczek
- Inne właściwości długości, takie jak Sound.RollOffMinDistance
Parametry
Zwroty
TranslateBy
Przesunięty Model przez podany Vector3 OFFSET, zachowując orientację modelu. Jeśli kolejny BasePart lub 1> Class.Terrain1> już istnieje w nowej pozycji, to 4> Class.Model4> będzie się łączyć z powyższym obiektem.
Tłumienie jest zastosowane w przestrzeni świata, a nie w przestrzeni obiektu, co oznacza, że nawet jeśli części modelu są orientowane inaczej, nadal będą się poruszać po standardowym osi.
Parametry
Zwroty
Przykłady kodu
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)