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.

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:

  • Gdy Humanoid i Part o nazwie Głowa pojawiają się pod modelu, pojawi się okienko nazwy/zdrowia GUI nad modelem; zobacz 1>Nazwa postaci/zdrowia1> dla szczegółów.
  • 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

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 przesyłaniem instancji.

  • Kontroluje zachowanie przesyłania modelu na Models , gdy jest włączone 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łasności przeniesie skalę, tak jakby Model/ScaleTo zostało na nią wezwane.

  • Bez replikacji
    Odczyt równoległy

    Określa, gdzie pivot a Model , który nie ma nie ma zestawu Model.PrimaryPart jest położony.

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):void

    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.

  • MoveTo(position : Vector3):void

    Przenieś PrimaryPart do określonej pozycji. Jeśli główna część nie została określona, zostanie użyta część korzeni modelu.

  • RemovePersistentPlayer(playerInstance : Player):void

    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.

  • ScaleTo(newScaleFactor : number):void

    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.

  • TranslateBy(delta : Vector3):void

    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.

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

Odczyt równoległy

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

Odczyt równoległy

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

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

Bez replikacji
Odczyt równoległy

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

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

void

Parametry

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

Zwroty

void

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.Model
local part = workspace.Part
local orientation, size = model:GetBoundingBox()
-- Zmień rozmiar i pozycję części równą kształtującemu się pudełku modelu
part.Size = size
part.CFrame = orientation

Zwroty

A CFrame reprezentujący orientację głosu, podążającą za Vector3 reprezentującą rozmiar głosu.

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

Rozmiar Vector3 ekstentów Model .

Przykłady kodu

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

Instances

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

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

void

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

position: Vector3

The Vector3 the Model is moved to.


Zwroty

void

Przykłady kodu

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

void

Parametry

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

Zwroty

void

ScaleTo

void

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

newScaleFactor: number

Zwroty

void

TranslateBy

void

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

delta: Vector3

The Vector3 to translate the Model by.


Zwroty

void

Przykłady kodu

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