Model

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

模型是容器對象,意味著它們會將對象組合在一起。它們最適合用於持有 BaseParts 的收藏,並且有一些功能可以擴展其功能。

模型是為了代表 幾何學意義 群組。如果您的群組沒有幾何學解釋,例如一個集合 Scripts ,請使用 Folder

由零件組成的模型通常有 PrimaryPart 設定,因為它指定哪個零件在模型中的哪一個零件將「追蹤隨」模型移動或被摧毀。靜態模型停留在同一位置不會受益於有主要零件設定。

模型有各種各樣的應用程式,包括 Roblox 玩家角色。它們也有一些獨特的行為,是重要要考慮的:

與所有 Instance 類型相同,在客戶端複製一個父級 Class

範例程式碼

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)

概要

屬性

屬性 繼承自 PVInstance

方法

方法 繼承自 PVInstance

屬性

外掛程式安全性
平行讀取

設定模型對實例啟用串流的體驗的詳細程度。

設為 StreamingMesh 時,低解析度「imposter」網格(顏色、粗糙網格覆蓋所有兒童零件)會在所有流媒體範圍外呈現。

當設為 DisabledAutomatic 時,會顯示較低解析度的網格。

ModelStreamingMode

平行讀取

控制 Models 在啟用 streaming 時是否會流入或流出。行為取決於選擇的枚列。沒有效果,當流式營運無法啟用。

此屬性只能在 Studio 中透過 屬性窗口 改變,當啟用直播時,或在 Scripts 中,但不會在 LocalScripts (因此可能會導致無法預測的行為) 中發生。

PrimaryPart

平行讀取

指向 Model 的主要部分。 主要部分是 BasePart ,作為模型的物理參考,對於模型的 pivot 起作用。 即當零件在模型中移動由於物理模擬或其他方式而導致 pivot 時,pivot 將與主要部分同步。

注意,Models 沒有預設的 PrimaryPart 設定。如果您正在創建一個需要物理學處理的模型,您應該手動設置此屬性在 Studio 或在指定的腳指令碼中。如果主要部分未設置,則隨時保持在世界空間中的中心位置,即使是在模型中的零件被移

請注意,當設定此屬性時,它必須是 BasePart ,這是模型的後代。如果您嘗試設置 Model.PrimaryPart

對於模型的一般規則是:

  • 擁有物理關節的模型,例如 WeldConstraintsMotor6Ds 應該有一個主要部分。 例如,Roblox 角色模型的 Model.PrimaryPart 預設設為 2>HumanoidRootPart2> 。
  • 靜態 (通常 Anchored ) 模型,在一個地方保持,除非有明確的指令,否則不需要 Model.PrimaryPart 並且往往會因為有一個設定合而帶來好處。

範例程式碼

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

未複製
無法建立指令碼
平行讀取

將此屬性在屬性窗口中設置會使模型以 Model/ScaleTo 的名稱縮放,縮放所有從模型中衍生的 Instances,以便模型能夠維持原始尺寸。

此屬性僅在 Studio 可用,並且在 ScriptLocalScript 中使用時會發生錯誤。 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 = 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"

範例程式碼

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)

方法

AddPersistentPlayer

void

參數

playerInstance: Player
預設值:"nil"

返回

void

GetBoundingBox

此功能返回一個包含所有 BasePart 子元素在 Model 中的描述。音樂的方向是基於 Class.Model.PrimaryPart|Primary

如果沒有 PrimaryPart 對於模型,則綁定箱將齊齊對稱在世界軸上。


local model = workspace.Model
local part = workspace.Part
local orientation, size = model:GetBoundingBox()
-- 將零件縮放並將其放置在模型的定位框中
part.Size = size
part.CFrame = orientation

返回

一個 CFrame 代表音量的方向,跟隨 Vector3 代表音量的大小。

GetExtentsSize

返回 BasePartsModel 中所有內容的最小尺寸。如果 Model.PrimaryPart 存在,則會將緊隨該部分。如果尚未設置主要部分,

注意此功能只會返回最小限定方塊的尺寸,並且開發人員必須使用自己的方法來取得限定方塊的位置。


返回

Datatype.Vector3 擴展 Class.Model 的大小。

範例程式碼

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

當此方法從 Script 呼叫時,會返回此模型持續的所有 Player 對象。當從 LocalScript 呼叫時,此方法只會檢查是否為 1> Class.Players.LocalPlayer|LocalPlayer1> 持續。


返回

Instances

一個包含此模型對象持續的所有 Player 對象的桌子。

GetScale

模型包含一個持續的大輔模式縮放因素,其起始值為 1 對於新建的模型和變更,當模型由 Model/ScaleTo 調用時。 此功能返回模型的當前大輔縮放因素。

目前的比例因素不會直接影響模型下的實例尺寸。它是用於內容創作和腳本編程的目的,以記得模型在原始尺寸上與其原來的尺寸相比。

在指定的會作業中,模型會在第一個 Model/ScaleTo 呼叫後儲存原始尺寸資訊。這意味著在 ScaleTo(x) 之後跟前 ScaleTo(1) 會獲得正確的原始尺寸資

縮放因素會以一種方式影響引擎行為:縮放因素的模型將被應用到 animations 在上述模型下播放的關節 Offset ,以便動畫貼模可以正確播放動畫,即使縮放。


返回

模型的當前投資加成因素。

範例程式碼

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

PrimaryPart 移動到指定位置。如果沒有指定主要部分,則會使用模型的根部分,但根部分不是定量,因此您總是應該在使用 MoveTo() 時設置主要部分。

如果需要移動模型,例如 Terrain 或其他 BaseParts ,模型將會垂直向上移動,直到沒有什麼擋道。如果此行為不是預期的,PVInstance:PivotTo() 應該用來代替。

注意,如果使用 MoveTo() 移動模型時,旋轉不會保持。建議使用 TranslateBy()PVInstance:PivotTo() 如果需要保留當前旋轉的模型。

參數

position: Vector3

Datatype.Vector3Model 將移動到。


返回

void

範例程式碼

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

參數

playerInstance: Player
預設值:"nil"

返回

void

ScaleTo

void

模型包含一個持續的大小比例因素,其起始值為 1 對於剛創建的模型。這個功能會對模型進行鏡像,在關節位置相對於 1 的大小比例因素。為此完成兩件事:

  • 設定模型的當前尺寸因素到指定值
  • 因此,所有後代實例的大小和位置都會重新調整

將位置的縮放在滾動位置。

所有「幾何」屬性的子孫 Instances 都會被調整。這很顯然包括零件的大小,但這裡有一些其他示例的屬性被調整:

  • Class.WeldConstraint|WeldConstraints 和 Class.Rope|Ropes
  • 物理速度和力,例如 Hinge.MaxServoTorque
  • 視覺屬性,例如粒子發射器的大小
  • 其他長度屬性,例如 Sound.RollOffMinDistance

參數

newScaleFactor: number

返回

void

TranslateBy

void

Model 由所提供的 Vector3 偏移值,保留模型的方向。如果另一個 BasePart 或 1> Class.Terrain1> 已在新位置,則 4> Class.Model4> 將覆蓋所述對物件。

翻譯在世界空間而不是對象空間中套用,即使模型的零件是以不同的方向旋轉,它們仍然會按照預期的方向移動。

參數

delta: Vector3

Datatype.Vector3 用於翻譯 Model 的。


返回

void

範例程式碼

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)

活動