模型是容器對象,意味著它們會將對象組合在一起。它們最適合用於持有 BaseParts 的收藏,並且有一些功能可以擴展其功能。
模型是為了代表 幾何學意義 群組。如果您的群組沒有幾何學解釋,例如一個集合 Scripts ,請使用 Folder 。
由零件組成的模型通常有 PrimaryPart 設定,因為它指定哪個零件在模型中的哪一個零件將「追蹤隨」模型移動或被摧毀。靜態模型停留在同一位置不會受益於有主要零件設定。
模型有各種各樣的應用程式,包括 Roblox 玩家角色。它們也有一些獨特的行為,是重要要考慮的:
- 當 Workspace.StreamingEnabled 設置為真,ModelStreamingMode 控制模型和任何子孫從客戶端重複和/或移除的方式。此外,LevelOfDetail 對繪製模型的渲染影響。
與所有 Instance 類型相同,在客戶端複製一個父級 Class
範例程式碼
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)
概要
屬性
設定模型對於啟用時間延遲的體驗的細節程度。
控制 Models 控制器時的模型傳輸行為,當啟用了實例傳輸。
Class.Model 或 nil ,如果未設定。
僅限編輯器的屬性,可以在模型的中心點上調整尺寸。設定此屬性會使尺寸在 Model/ScaleTo 上呼叫。
確定 Model 的中心位置,其中 不 有設置 Model.PrimaryPart 。
方法
將此模型設定為持續為指定玩家。 Model.ModelStreamingMode 必須設置為 PersistentPerPlayer 才能因為添加而變更行為。
返回包含模型所有部分的音量的說明。
返回 BaseParts 的尺寸,Model 與 Model.PrimaryPart 如果設定。
返回此模型對象的所有 Player 對象。 行為因 Script 或 LocalScript 而來自。
返回模型的標準尺寸,其預設為 1 對於新建的模型,並且會在通過 Model/ScaleTo 變更時更改。
將 PrimaryPart 移動到指定位置。如果沒有指定主要零件,則會使用模型的根部分。
此模型不再對指定玩家持續,必須設置為 Model.ModelStreamingMode 才能變更行為,作為結果的一部分。
設定模型的比例因素,以調整所有子孫實例的大小和位置,使其在比例因素變更 1 時,對眾生實例的大小和位置進行相對的比例調整。
將 Model 由所提供的 Vector3 偏移值,保留模型的方向。如果另一個 BasePart 或 1> Class.Terrain1> 已在新位置,則 4> Class.Model4> 將覆蓋所述對物件。
取得 PVInstance 的中心點。
以下是 PVInstance 和所有其子 PVInstances 的描述,以便 pivot 現在位於指定的 CFrame 。
屬性
ModelStreamingMode
控制 Models 在啟用 streaming 時是否會流入或流出。行為取決於選擇的枚列。沒有效果,當流式營運無法啟用。
此屬性只能在 Studio 中透過 屬性窗口 改變,當啟用直播時,或在 Scripts 中,但不會在 LocalScripts (因此可能會導致無法預測的行為) 中發生。
PrimaryPart
指向 Model 的主要部分。 主要部分是 BasePart ,作為模型的物理參考,對於模型的 pivot 起作用。 即當零件在模型中移動由於物理模擬或其他方式而導致 pivot 時,pivot 將與主要部分同步。
注意,Models 沒有預設的 PrimaryPart 設定。如果您正在創建一個需要物理學處理的模型,您應該手動設置此屬性在 Studio 或在指定的腳指令碼中。如果主要部分未設置,則隨時保持在世界空間中的中心位置,即使是在模型中的零件被移
請注意,當設定此屬性時,它必須是 BasePart ,這是模型的後代。如果您嘗試設置 Model.PrimaryPart
對於模型的一般規則是:
- 擁有物理關節的模型,例如 WeldConstraints 或 Motor6Ds 應該有一個主要部分。 例如,Roblox 角色模型的 Model.PrimaryPart 預設設為 2>HumanoidRootPart2> 。
- 靜態 (通常 Anchored ) 模型,在一個地方保持,除非有明確的指令,否則不需要 Model.PrimaryPart 並且往往會因為有一個設定合而帶來好處。
範例程式碼
-- 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
將此屬性在屬性窗口中設置會使模型以 Model/ScaleTo 的名稱縮放,縮放所有從模型中衍生的 Instances,以便模型能夠維持原始尺寸。
此屬性僅在 Studio 可用,並且在 Script 或 LocalScript 中使用時會發生錯誤。 Model/ScaleTo 和 1>Model/GetScale1> 應該從脚本中使用。
WorldPivot
這個屬性決定 Model 的中心位置,其中 不 有設定 Model.PrimaryPart 。如果 2>
對於剛剛創建的 Model ,其 pivot 將被視為其內容的邊界盒的中心,直到 第一次 其 Model.WorldPivot 屬性設置為設定。一旦世界 pivot 設置為第一次,就無法恢復此初始行為。
最常見的情況是,使用 Studio 工具移動模型,或使用模型移動功能,例如 PVInstance:PivotTo() 和 Model:MoveTo(),將設定世界軸,從而結束此新模型行為。
此行為的目的是允許 Lua 代碼獲得合理的扶手,只需要在新模型上建立並親繫對象,而不需要每次在代碼中建立 Model.WorldPivot 。
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"
範例程式碼
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)
方法
GetBoundingBox
此功能返回一個包含所有 BasePart 子元素在 Model 中的描述。音樂的方向是基於 Class.Model.PrimaryPart|Primary
如果沒有 PrimaryPart 對於模型,則綁定箱將齊齊對稱在世界軸上。
local model = workspace.Modellocal part = workspace.Partlocal orientation, size = model:GetBoundingBox()-- 將零件縮放並將其放置在模型的定位框中part.Size = sizepart.CFrame = orientation
返回
GetExtentsSize
返回 BaseParts 在 Model 中所有內容的最小尺寸。如果 Model.PrimaryPart 存在,則會將緊隨該部分。如果尚未設置主要部分,
注意此功能只會返回最小限定方塊的尺寸,並且開發人員必須使用自己的方法來取得限定方塊的位置。
返回
Datatype.Vector3 擴展 Class.Model 的大小。
範例程式碼
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
當此方法從 Script 呼叫時,會返回此模型持續的所有 Player 對象。當從 LocalScript 呼叫時,此方法只會檢查是否為 1> Class.Players.LocalPlayer|LocalPlayer1> 持續。
返回
一個包含此模型對象持續的所有 Player 對象的桌子。
GetScale
模型包含一個持續的大輔模式縮放因素,其起始值為 1 對於新建的模型和變更,當模型由 Model/ScaleTo 調用時。 此功能返回模型的當前大輔縮放因素。
目前的比例因素不會直接影響模型下的實例尺寸。它是用於內容創作和腳本編程的目的,以記得模型在原始尺寸上與其原來的尺寸相比。
在指定的會作業中,模型會在第一個 Model/ScaleTo 呼叫後儲存原始尺寸資訊。這意味著在 ScaleTo(x) 之後跟前 ScaleTo(1) 會獲得正確的原始尺寸資
縮放因素會以一種方式影響引擎行為:縮放因素的模型將被應用到 animations 在上述模型下播放的關節 Offset ,以便動畫貼模可以正確播放動畫,即使縮放。
返回
模型的當前投資加成因素。
範例程式碼
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
將 PrimaryPart 移動到指定位置。如果沒有指定主要部分,則會使用模型的根部分,但根部分不是定量,因此您總是應該在使用 MoveTo() 時設置主要部分。
如果需要移動模型,例如 Terrain 或其他 BaseParts ,模型將會垂直向上移動,直到沒有什麼擋道。如果此行為不是預期的,PVInstance:PivotTo() 應該用來代替。
注意,如果使用 MoveTo() 移動模型時,旋轉不會保持。建議使用 TranslateBy() 或 PVInstance:PivotTo() 如果需要保留當前旋轉的模型。
參數
返回
範例程式碼
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
模型包含一個持續的大小比例因素,其起始值為 1 對於剛創建的模型。這個功能會對模型進行鏡像,在關節位置相對於 1 的大小比例因素。為此完成兩件事:
- 設定模型的當前尺寸因素到指定值
- 因此,所有後代實例的大小和位置都會重新調整
將位置的縮放在滾動位置。
所有「幾何」屬性的子孫 Instances 都會被調整。這很顯然包括零件的大小,但這裡有一些其他示例的屬性被調整:
- Class.WeldConstraint|WeldConstraints 和 Class.Rope|Ropes
- 物理速度和力,例如 Hinge.MaxServoTorque
- 視覺屬性,例如粒子發射器的大小
- 其他長度屬性,例如 Sound.RollOffMinDistance
參數
返回
TranslateBy
將 Model 由所提供的 Vector3 偏移值,保留模型的方向。如果另一個 BasePart 或 1> Class.Terrain1> 已在新位置,則 4> Class.Model4> 將覆蓋所述對物件。
翻譯在世界空間而不是對象空間中套用,即使模型的零件是以不同的方向旋轉,它們仍然會按照預期的方向移動。
參數
返回
範例程式碼
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)