模型是容器对象,意味着它们可以将对象组合在一起。它们最常用于持有 BaseParts 的收藏,并且有一系列功能来扩展其功能。
模型是用于表示 几何学习群组 的集合。如果您的群组没有几何解释,例如一个包含 Scripts 的集合,请使用 Folder 代替。
由零件组成的模型通常有一个 PrimaryPart 设置,因为它指定模型中哪个部分将在模型移动或被销毁通过物理模拟时“关注随”。静电模型将在一个位置上保持在一个位置上,因此它不会受益于有一个主要部分设置。
模型有各种各样的应用,包括 Roblox 玩家角色。它们还有一系列重要的独特行为,值得注意:
- 当 Workspace.StreamingEnabled 设置为 true 时,ModelStreamingMode 的价值控制各种模型和子模型在客户端上复制和/或移除的方式。此外,LevelOfDetail 对1> Class.Model.Render1> 的渲染影响。
与所有 Instance 类型的类型一样,父级 Model 复
代码示例
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 必须设置为 PersistentPerPlayer 才能因为移除而改变行为。
设置模型的缩放因素,调整所有子集实例的尺寸和位置,使其在缩放因素为 1 时,相对于其初始大小和位置拥有该缩放因素。
使用 Model 的给定 Offset,将模型的方向保偏移值,如果另一个 Vector3 或 BasePart 已经在新位置,那么 1> Class.Model1> 将覆盖该对象。
获得 PVInstance 的枢轴。
形成 PVInstance 与所有的后代 PVInstances ,使 pivot 现在位于指定的 CFrame 。
属性
LevelOfDetail
为有实例串流的体验设置模型的细节级别。
当设置为 StreamingMesh 时,低分辨率“imposter” 网格(颜色粗糙网格,覆盖模型所有子部件)在屏幕外的流媒体范围内渲染。
ModelStreamingMode
控制当 Models 被流式时,控制是否为 流式 或为 流式 。行为依赖于选定的枚列。无效时不会影响。
此属性仅在 Studio 通过 属性 窗口时更改,或在 Scripts 中,但从来不会在 LocalScripts (通过此进行可能会导致未定义的行为) 中更改。
PrimaryPart
指向 Model 的主要部分。 主要部分是 BasePart ,作为模型的物理参考,它在模型的旋转上起着物理参考作用。 当模型中的部分因物理模拟或其他方式而移动时,主要部分会同步移动。
注意,Models 不有默认设置 PrimaryPart 。 如果您正在创建需要物理行动的模型,您应该手动在 Studio 或脚本中设置此属性。 如果主要部分未设置,pivot 将在世界空间中保持相同的位置,即使模型中的零件被移动。
请注意,当设置此属性时,它必须是一个 BasePart ,它是模型的后代。如果您尝试将 Model.PrimaryPart 设置为一个 <
对于模型的一般规则是:
- 由 WeldConstraints 或 Motor6Ds 等物理共同部件连接起来的模型应该有一个主要部分。 例如,Roblox角色模型的 Model.PrimaryPart 设置为默认值 1>HumanoidRootPart1> 。
- 静电 (通常 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 。如果1> Class.Model
对于刚刚创建的 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 中的描述。该卷的 orientación 是基于 Class.Model.PrimaryPart|PrimaryPart</
如果没有 PrimaryPart 对于模型,边界盒将对世界轴对齐。
local model = workspace.Modellocal part = workspace.Partlocal orientation, size = model:GetBoundingBox()-- 将零件重新调整和位置与模型的边框相等part.Size = sizepart.CFrame = orientation
返回
GetExtentsSize
返回 Class.BasePart|BaseParts 在 Class.Model 中所有内容的最小边界盒的尺寸。如果 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 调用后保存子代实例的精确原始大小信息。这意味着调用 ScaleTo(x) 跟随着 ScaleTo(1) 会得到您返回原始配置模型
缩放因素会影响引擎的行为以一种方式:缩放因素将适用于 animations 在 AnimationController 下播放的共同 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 都会缩放。这明显包括零件的大小,但这里有一些其他示例:
- 如果有 WeldConstraints 和 Class.Rope|Ropes 的长度
- 物理速度和力,例如 Hinge.MaxServoTorque
- 视觉属性,例如粒子发射器的大小
- 其他长度属性,例如 Sound.RollOffMinDistance
参数
返回
TranslateBy
使用 Model 的给定 Offset,将模型的方向保偏移值,如果另一个 Vector3 或 BasePart 已经在新位置,那么 1> Class.Model1> 将覆盖该对象。
翻译在世界空间而不是对象空间中应用,即使零件的方向不同,它仍然会沿标准轴移动。
参数
返回
代码示例
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)