BasePart

显示已弃用

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

无法创建
不可浏览

BasePart 是一个抽象的基地

了解有关 BaseParts 如何被组成模拟的刚体,请参阅组合

有很多与 BasePart (除了 Terrain 之外) 互动的对象,包括:

概要

属性

继承自PVInstance属性

方法

继承自PVInstance方法

活动

属性

Anchored

读取并联

锚定 属性决定部件是否会按照物理学原理固定在一个位置。启用时,一部件的位置永远不会因重力、其他部件碰撞、交叉其他部件或其他物理相关原因而改变。因结果,两个锚定的部件将不会在相互之间触发 BasePart.Touched 事件。

固定部分仍然可以通过更改其 CFramePosition 来移动,它仍然可以有一个非零 AssemblyLinearVelocity 和 1> Class.BasePart.AssemblyAngularVelocity|AssemblyLinearVelocity1> 。

最后,如果未锚定的部分与锚定的部分通过一个对象,例如 Weld ,它也会作为锚定的。如果该关联断裂,部分可能会受到物理学的影响。请参阅组合获取更多信息。

网络所有者无法在锚定部件上设置。如果服务器上的锚定状态发生变更,那么该部件的网络所有者将受影响。

代码示例

Part Anchored Toggle

local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)

AssemblyAngularVelocity

未复制
读取并联

这部件的装配的角向速度ベクト。它是每秒钟的角向速度的改变率。

角度速度在整个装配过程中都一致。

直接设置速度可能会导致不实的移动。使用 TorqueAngularVelocity 限制是首选,或使用 BasePart:ApplyAngularImpulse() 如果您想要立即更改速度。

如果零件是由服务器拥有的,此属性必须从服务器 Script (不是从 Class.Loca脚本

AssemblyCenterOfMass

只读
未复制
读取并联

一个位置通过 massposition 的所有部分在装配中计算。

如果装配有锚定的部分,该部分的中心将是装配的中心,装配将有无限的质量。

知道中心的重量可以帮助装配保持稳定。 对中心的力应力与角度加速不会造成角度加速,只是直线。 有一个低中心的装配会在重力效果下保持稳定。

AssemblyLinearVelocity

未复制
读取并联

此部件的装配中的直线速度向量。它是由装配的 center of mass 在每秒钟的速度变化。

如果您想要知道在装配中心以外的任何位置的速度,请使用 BasePart:GetVelocityAtPosition()

直接设置速度可能会导致不实的移动。使用 VectorForce 限制,或使用 BasePart:ApplyImpulse() 如果您想要立即更改速度。

如果零件是由服务器拥有的,此属性必须从服务器 Script (不是从 Class.Loca脚本

AssemblyMass

只读
未复制
读取并联

此部分的装配中,所有 parts 的 масс总和。零件 that 是 Class.BasePart.Massless|Massless 且不是装配的根部分,将不会为AssemblyMass 做贡献。

如果装配有锚定部分,装配的 mass 是无限的。 约束和其他物理交互,可能会导致 instabilities。

AssemblyRootPart

只读
未复制
读取并联

这个属性表示 BasePart 自动选择代表装置的根部分。它是与开发人员调用 GetRootPart() 相同的部分。

根部分可通过更改装配中的零件的 RootPriority 来改变。

所有共享相同AssemblyRootPart的零件都在同一个装配中。

了解有关根部的更多信息,请参阅组合

BackSurface

读取并联

BackSurface 属性确定零件的 +Z 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.BackSurfaceInput 确定发动机的联接应该怎么行为。

大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

BottomSurface

读取并联

底表面属性确定零件的 -Y 方向的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的。如果设置为“Motor”,BasePart.BottomSurfaceInput 确定发动机的联接方式。

大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

BrickColor

未复制
读取并联

BrickColor 属性确定零件的颜色。如果零件有一个 BasePart.Material ,这也会决定在渲染材质时使用的颜色。为了获得更多对颜色的控制,BasePart.Color 属性可以用 (它是 Color3 变体的这个属性)。如果 Color 设置,这个属性将使用最近的 BrickColor。

其他零件的视觉属性由 BasePart.TransparencyBasePart.Reflectance 决定。

代码示例

Part Anchored Toggle

local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)

CFrame

读取并联

CFrame 属性确定了世界上 BasePart 的位置和方向。它作为对象在几何学上的任意引用位置,但 ExtentsCFrame 代表其实体中心的 1> Datatype.CFrame1>。

当在零件上设置 CFrame 时,其他加入的零件也会相对于零件移动,但建议您使用 PVInstance:PivotTo() 来移动整个模型,例如在传送玩家角色时。

与设置 BasePart.Position 不同,设置 BasePart.CFrame 将总是将零件移到准确的 CFrame ;在其他 words: 1> 无重叠检查是完成的1> ,物理解决器将尝试解决任何重叠,除非两个部分

对零件的 CFrameAttachment 的位置进行跟踪可能有助于使用 Class. Attendance 。

代码示例

Setting Part CFrame

local part = script.Parent:WaitForChild("Part")
local otherPart = script.Parent:WaitForChild("OtherPart")
-- Reset the part's CFrame to (0, 0, 0) with no rotation.
-- This is sometimes called the "identity" CFrame
part.CFrame = CFrame.new()
-- Set to a specific position (X, Y, Z)
part.CFrame = CFrame.new(0, 25, 10)
-- Same as above, but use a Vector3 instead
local point = Vector3.new(0, 25, 10)
part.CFrame = CFrame.new(point)
-- Set the part's CFrame to be at one point, looking at another
local lookAtPoint = Vector3.new(0, 20, 15)
part.CFrame = CFrame.lookAt(point, lookAtPoint)
-- Rotate the part's CFrame by pi/2 radians on local X axis
part.CFrame = part.CFrame * CFrame.Angles(math.pi / 2, 0, 0)
-- Rotate the part's CFrame by 45 degrees on local Y axis
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)
-- Rotate the part's CFrame by 180 degrees on global Z axis (note the order!)
part.CFrame = CFrame.Angles(0, 0, math.pi) * part.CFrame -- Pi radians is equal to 180 degrees
-- Composing two CFrames is done using * (the multiplication operator)
part.CFrame = CFrame.new(2, 3, 4) * CFrame.new(4, 5, 6) --> equal to CFrame.new(6, 8, 10)
-- Unlike algebraic multiplication, CFrame composition is NOT communitative: a * b is not necessarily b * a!
-- Imagine * as an ORDERED series of actions. For example, the following lines produce different CFrames:
-- 1) Slide the part 5 units on X.
-- 2) Rotate the part 45 degrees around its Y axis.
part.CFrame = CFrame.new(5, 0, 0) * CFrame.Angles(0, math.rad(45), 0)
-- 1) Rotate the part 45 degrees around its Y axis.
-- 2) Slide the part 5 units on X.
part.CFrame = CFrame.Angles(0, math.rad(45), 0) * CFrame.new(5, 0, 0)
-- There is no "CFrame division", but instead simply "doing the inverse operation".
part.CFrame = CFrame.new(4, 5, 6) * CFrame.new(4, 5, 6):Inverse() --> is equal to CFrame.new(0, 0, 0)
part.CFrame = CFrame.Angles(0, 0, math.pi) * CFrame.Angles(0, 0, math.pi):Inverse() --> equal to CFrame.Angles(0, 0, 0)
-- Position a part relative to another (in this case, put our part on top of otherPart)
part.CFrame = otherPart.CFrame * CFrame.new(0, part.Size.Y / 2 + otherPart.Size.Y / 2, 0)

CanCollide

读取并联

CanCollide 确定要与其他部件是否物理上互动。 禁用时,其他部件通过砖块不受中断。 用于装饰的部件通常有 CanCollide 已禁用,因为它们不需要被物理引擎考虑。

如果零件不是 BasePart.Anchored 且具有“Workspace.FallenPartsDestroyHeight”禁用,它可能会出世以最终被摧毁 by Class.Workspace.工作间allenPartsDestroyHeight。

禁用了CanCollide后,零件仍然会触发BasePart.Touched事件(包括其他零件也触发它)。您可以使用BasePart.CanTouch来禁用它。

了解有关碰撞的更多信息,请参阅碰撞

代码示例

Fade Door

-- Paste into a Script inside a tall part
local part = script.Parent
local OPEN_TIME = 1
-- Can the door be opened at the moment?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Black")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Bright blue")
end
local function onTouch(otherPart)
-- If the door was already open, do nothing
if debounce then
print("D")
return
end
-- Check if touched by a Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("not human")
return
end
-- Perform the door opening sequence
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()

CanQuery

读取并联

CanQuery 可以确定零件是否在空间查询操作中被视为零件,例如 GetPartBoundsInBoxRaycastCanCollide 必须也被禁用,当禁用 CanQuery 时。这些函数不会包含因 2>

除此之外,还可以使用 OverlapParamsRaycastParams 对象来调用空间查询函数时,来排除与给定列表中的零件的子集。

CanTouch

读取并联

此属性确定 whether Touched

注意,此碰撞逻辑可以通过 Clas工作间.Workspace.TouchesUseCollisionGroups 属性设置为 Workspace.TouchesUseCollisionGroups 群组 true 通过。如果 2>true2>,非 collisions 群组的零件将在 5>和5> 触摸事件之间忽略 both collisions ,从而使此属性无效。

性能

当零件具有 both CanTouchCanCollide 设置为 false 时,因为这些零件永远不需要计算任何类型的零件碰撞。但它们仍然

CastShadow

读取并联

是否或否决定零件是否投射阴影。

注意,该功能不是为了性能提高而设计的。它只应该在你想要隐藏零件阴影的部件上禁用。禁用此属性对于该部件可能会导致视觉艺术效果在阴影上 cast 。

CenterOfMass

只读
未复制
读取并联

中心OfMass 属性描述了零件的中心 of mass 位置。如果这是一个单个部件的组合,这是从世界空间转换到本地的 AssemblyCenterOfMass 。 在简单的 AssemblyCenterOfMass 上,中心 of mass 总是 (0,0,0)。它可以变为 Class.

CollisionGroup

未复制
读取并联

Class.BasePart.CollisionGroup|CollisionGroup 属性描述零件的冲突组 (最多 100 个字符) 的名称。零件从默认组开始 (默认组的名称为 “"Default"”) 。此值不能为空。

尽管这个属性本身不是复制品,但引擎内部复制值通过另一个私人属性解决后端兼容问题。

代码示例

PhysicsService:RegisterCollisionGroup

local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
-- Register collision groups
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
-- Assign parts to collision groups
script.Parent.BallPart.CollisionGroup = collisionGroupBall
script.Parent.DoorPart.CollisionGroup = collisionGroupDoor
-- Set groups as non-collidable with each other and check the result
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) --> false

Color

未复制
读取并联

颜色属性确定零件的颜色。如果零件有一个 BasePart.Material,这也会决定在渲染材质时使用的颜色。如果该属性已设置, BasePart.BrickColor 将使用 Color3 值最近的 BrickColor 来决定使用的颜色。

其他零件的视觉属性由 BasePart.TransparencyBasePart.Reflectance 决定。

代码示例

Character Health Body Color

-- Paste into a Script within StarterCharacterScripts
-- Then play the game, and fiddle with your character's health
local char = script.Parent
local human = char.Humanoid
local colorHealthy = Color3.new(0.4, 1, 0.2)
local colorUnhealthy = Color3.new(1, 0.4, 0.2)
local function setColor(color)
for _, child in pairs(char:GetChildren()) do
if child:IsA("BasePart") then
child.Color = color
while child:FindFirstChildOfClass("Decal") do
child:FindFirstChildOfClass("Decal"):Destroy()
end
elseif child:IsA("Accessory") then
child.Handle.Color = color
local mesh = child.Handle:FindFirstChildOfClass("SpecialMesh")
if mesh then
mesh.TextureId = ""
end
elseif child:IsA("Shirt") or child:IsA("Pants") then
child:Destroy()
end
end
end
local function update()
local percentage = human.Health / human.MaxHealth
-- Create a color by tweening based on the percentage of your health
-- The color goes from colorHealthy (100%) ----- > colorUnhealthy (0%)
local color = Color3.new(
colorHealthy.R * percentage + colorUnhealthy.r * (1 - percentage),
colorHealthy.G * percentage + colorUnhealthy.g * (1 - percentage),
colorHealthy.B * percentage + colorUnhealthy.b * (1 - percentage)
)
setColor(color)
end
update()
human.HealthChanged:Connect(update)

CurrentPhysicalProperties

只读
未复制
读取并联

当前物理属性显示当前部件的物理属性。您可以为每个部件设置自定义物理属性,自定义材料,并且对材料进行覆盖。引擎优先考虑在确定零件有效物理属性时最高级的定义。以下列表中的值是按照从高到低的优先级排列的:

  • 零件的自定义物理属性
  • 零件自定义材料的自定义物理属性
  • 自定义物理属性的零件材料覆盖
  • 零件材料的默认物理属性

CustomPhysicalProperties

读取并联

自定义物理属性允许您定制Part的各个物理属性,例如其密度、摩擦力和弹性。

启用时,此属性允许您配置这些物理属性。如果未启用,这些物理属性是由零件的 BasePart.Material 决定的。页面 Enum.Material 包含各种零件材料的列表。

代码示例

Set CustomPhysicalProperties

local part = script.Parent
-- This will make the part light and bouncy!
local DENSITY = 0.3
local FRICTION = 0.1
local ELASTICITY = 1
local FRICTION_WEIGHT = 1
local ELASTICITY_WEIGHT = 1
local physProperties = PhysicalProperties.new(DENSITY, FRICTION, ELASTICITY, FRICTION_WEIGHT, ELASTICITY_WEIGHT)
part.CustomPhysicalProperties = physProperties

EnableFluidForces

读取并联

当真,并且当 Workspace.FluidForces 启用时,使物理引擎在此 BasePart 上计算气动力。

ExtentsCFrame

只读
未复制
读取并联

Class.BasePart 的物理部分的 BasePart ,代表其物理中心。

ExtentsSize

只读
未复制
读取并联

Class.BasePart 的实际物理大小,例如在碰撞检测中。

FrontSurface

读取并联

前表面属性确定零件的 -Z 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.FrontSurfaceInput 确定发动机的联接方式。

如果 BasePart.Material 设置为“塑料”,大多数表面类型都会渲染在零件面上。一些表面类型,包括枢轴、机器和步进机,会在游戏世界中类似于SurfaceSelection 的 3D 装饰。如果在属性窗口中选择此属性,它将在游戏世界中与Class.SurfaceSelection的

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

LeftSurface

读取并联

左表面属性确定零件的 -X 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的BasePart.LeftSurfaceInput。如果设置为“Motor”,Class.BasePart.LeftSurfaceInput 确定零件的共同行为。

如果 BasePart.Material 设置为“塑料”,大多数表面类型都会渲染在零件面上。一些表面类型,包括枢轴、机器和步进机,会在游戏世界中类似于SurfaceSelection 的 3D 装饰。如果在属性窗口中选择此属性,它将在游戏世界中与Class.SurfaceSelection的

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

LocalTransparencyModifier

隐藏
未复制
读取并联

Class.BasePart.LocalTransparency 属性是 BasePart.Transparency 的倍增器,该属性仅对本地客户端可见。它不会从客户端到服务器复制,并且对于特定客户端无法渲染的部分,例如玩家在第一人称模式下不能见到他们的角色身体部分。

这个属性通过以下方式修改本地部件的透明度,并使其在 0 和 1 之间进行调整,


clientTransparency = 1 - ((1 - part.Transparency) * (1 - part.LocalTransparencyModifier))

<tbody>
<tr>
<td>0.5</td>
<td>0</td>
<td>0.5</td>
<td>0.5</td>
</tr>
<tr>
<td>0.5</td>
<td>0.25</td>
<td>0.5</td>
<td>0.625</td>
</tr>
<tr>
<td>0.5</td>
<td>0.5</td>
<td>0.5</td>
<td>0.75</td>
</tr>
<tr>
<td>0.5</td>
<td>0.75</td>
<td>0.5</td>
<td>0.875</td>
</tr>
<tr>
<td>0.5</td>
<td>1</td>
<td>0.5</td>
<td>1</td>
</tr>
</tbody>
透明度本地透明度调整器服务器端透明度客户端透明度

Locked

读取并联

锁定属性确定是否在 Roblox Studio 通过单击它来选择 (或在 part (或在 model 中)是否选择。 此属性通常在环境模型中的零件中启用。 Roblox Studio 有一个锁定/解锁所有工具,可以在当前模型中切换锁定状态。

代码示例

Recursive Unlock

-- Paste into a Script within a Model you want to unlock
local model = script.Parent
-- This function recurses through a model's heirarchy and unlocks
-- every part that it encounters.
local function recursiveUnlock(object)
if object:IsA("BasePart") then
object.Locked = false
end
-- Call the same function on the children of the object
-- The recursive process stops if an object has no children
for _, child in pairs(object:GetChildren()) do
recursiveUnlock(child)
end
end
recursiveUnlock(model)

Mass

只读
未复制
读取并联

批量 是一个只读的属性,用于描述零件的音量和密度。它由 GetMass 函数返回。

Massless

读取并联

如果该属性已打开,BasePart 将不会在它的装配体中的总质量或粒度上贡献任何贡献,直到它被焊接到另一个有质量的部件上。

如果零件是根据 AssemblyRootPart 的根,这将为该零件忽略,它仍然会为其提供装配性能和隔离性,就像其他部分一样。如果零件无重量的零件,它们永远不会成为装配根部分,直到所有其他部分都无重量。

这可能对于车辆上的可选配件不是很有用,例如你不想影响车辆操纵的简易碰撞网格。

还请参阅组合,这是一个描述根部件和如何使用它们的文章。

读取并联

材料属性允许建筑师设置零件的材质和默认物理属性(在BasePart.CustomPhysicalProperties未设置的情况下)。默认塑料材质具有很轻的材质,而 SmoothPlastic 材质完全没有纹理。一些材质的材质,例如钻石板和花岗岩,具有非常明显的材质。每种材质的材质都会随着钢板的不同而反

设置此属性,然后启用 BasePart.CustomPhysicalProperties 将使用材料的默认物理属性。例实例,钻石板是一个很密的材料,而木材是一个很轻的材料。一部分的密度决定它在地形水中漂浮。

玻璃材料在适中的图形设置上改变渲染行为。它应用一些反射性(类似于 BasePart.Reflectance)和视角歪曲。效果特别明显在球形零件上(将 BasePart.Shape 设置为球)。半透明对象和玻璃部分在玻璃后不可见。

代码示例

Part Anchored Toggle

local part = script.Parent
-- Create a ClickDetector so we can tell when the part is clicked
local cd = Instance.new("ClickDetector", part)
-- This function updates how the part looks based on its Anchored state
local function updateVisuals()
if part.Anchored then
-- When the part is anchored...
part.BrickColor = BrickColor.new("Bright red")
part.Material = Enum.Material.DiamondPlate
else
-- When the part is unanchored...
part.BrickColor = BrickColor.new("Bright yellow")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- Toggle the anchored property
part.Anchored = not part.Anchored
-- Update visual state of the brick
updateVisuals()
end
-- Update, then start listening for clicks
updateVisuals()
cd.MouseClick:Connect(onToggle)

MaterialVariant

未复制
读取并联

系统使用指定的 MaterialVariant 名称和 BasePart.Material 类型搜索 MaterialService 实例。如果找到匹配的 MaterialVariant 实例,它将使用此 MaterialVariant 实例来替换默认材料。默认材料可以是内置材料或指定的 MaterialVariant 类输入。

Orientation

隐藏
未复制
读取并联

方向属性描述方向在 X、Y 和 Z 轴上的旋转度数,使用 Vector3 应用。旋转都是在 Y → X → Z 顺序使用。这与正确的

当设置此属性任何 WeldsMotor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任

焊接约束也将在移动工具动期间被禁用并重新启用。

代码示例

Part Spinner

local part = script.Parent
local INCREMENT = 360 / 20
-- Rotate the part continually
while true do
for degrees = 0, 360, INCREMENT do
-- Set only the Y axis rotation
part.Rotation = Vector3.new(0, degrees, 0)
-- A better way to do this would be setting CFrame
--part.CFrame = CFrame.new(part.Position) * CFrame.Angles(0, math.rad(degrees), 0)
task.wait()
end
end

PivotOffset

读取并联

此属性指定零件的中心偏移从其 CFrame ,其中 part:GetPivot()part.CFrame * part.PivotOffset 相同。

这很方便地将枢轴设置在 本地 空间中,但将零件的枢轴设置在 世界 空间中可以执行如下操作:


local part = workspace.BluePart
local desiredPivotCFrameInWorldSpace = CFrame.new(0, 10, 0)
part.PivotOffset = part.CFrame:ToObjectSpace(desiredPivotCFrameInWorldSpace)

代码示例

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)
Clock Hands

local function createHand(length, width, yOffset)
local part = Instance.new("Part")
part.Size = Vector3.new(width, 0.1, length)
part.Material = Enum.Material.Neon
part.PivotOffset = CFrame.new(0, -(yOffset + 0.1), length / 2)
part.Anchored = true
part.Parent = workspace
return part
end
local function positionHand(hand, fraction)
hand:PivotTo(CFrame.fromEulerAnglesXYZ(0, -fraction * 2 * math.pi, 0))
end
-- Create dial
for i = 0, 11 do
local dialPart = Instance.new("Part")
dialPart.Size = Vector3.new(0.2, 0.2, 1)
dialPart.TopSurface = Enum.SurfaceType.Smooth
if i == 0 then
dialPart.Size = Vector3.new(0.2, 0.2, 2)
dialPart.Color = Color3.new(1, 0, 0)
end
dialPart.PivotOffset = CFrame.new(0, -0.1, 10.5)
dialPart.Anchored = true
dialPart:PivotTo(CFrame.fromEulerAnglesXYZ(0, (i / 12) * 2 * math.pi, 0))
dialPart.Parent = workspace
end
-- Create hands
local hourHand = createHand(7, 1, 0)
local minuteHand = createHand(10, 0.6, 0.1)
local secondHand = createHand(11, 0.2, 0.2)
-- Run clock
while true do
local components = os.date("*t")
positionHand(hourHand, (components.hour + components.min / 60) / 12)
positionHand(minuteHand, (components.min + components.sec / 60) / 60)
positionHand(secondHand, components.sec / 60)
task.wait()
end

Position

隐藏
未复制
读取并联

位置属性描述使用 part 的坐标来表示 Vector3 的位置。它反映部件的 BasePart.CFrame 位置,但也可以设置。

当设置此属性任何 WeldsMotor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任

焊接约束也将在移动工具动期间被禁用并重新启用。

ReceiveAge

隐藏
只读
未复制
读取并联

这将时间以秒计时,因为零件的物理模型上次更新于本地客户机(或服务器)。当零件无物理时(已锚定),将返回 0

Reflectance

读取并联

反射率属性决定part反射天空盒子的程度。一个值为 0 表示零,一个值为 1 表示完全反射。

反射率不受 BasePart.Transparency 影响,除非零件完全透明,否则反射率不会渲染。反射率可能会或不会被忽略,这取决于零件的 BasePart.Material

代码示例

Touch Blink

local part = script.Parent
local pointLight = Instance.new("PointLight")
pointLight.Brightness = 0
pointLight.Range = 12
pointLight.Parent = part
local touchNo = 0
local function blink()
-- Advance touchNo to tell other blink() calls to stop early
touchNo = touchNo + 1
-- Save touchNo locally so we can tell when it changes globally
local myTouchNo = touchNo
for i = 1, 0, -0.1 do
-- Stop early if another blink started
if touchNo ~= myTouchNo then
break
end
-- Update the blink animation
part.Reflectance = i
pointLight.Brightness = i * 2
task.wait(0.05)
end
end
part.Touched:Connect(blink)

ResizeIncrement

只读
未复制
读取并联

调整大小增量属性是一个只读的属性,描述 BasePart:Resize() 方法可以允许的最小变更大小的描述。它与 BasePart 抽象类型实现不同。例实例, Part 有此设置为 1,1> Class.

代码示例

Resize Handles

-- Put this Script in several kinds of BasePart, like
-- Part, TrussPart, WedgePart, CornerWedgePart, etc.
local part = script.Parent
-- Create a handles object for this part
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- Manually specify the faces applicable for this handle
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- Alternatively, use the faces on which the part can be resized.
-- If part is a TrussPart with only two Size dimensions
-- of length 2, then ResizeableFaces will only have two
-- enabled faces. For other parts, all faces will be enabled.
handles.Faces = part.ResizeableFaces

ResizeableFaces

只读
未复制
读取并联

Class.BasePart 的大小可以调整,用于调整零件的大小。在 BasePart 和 Class.W

代码示例

Resize Handles

-- Put this Script in several kinds of BasePart, like
-- Part, TrussPart, WedgePart, CornerWedgePart, etc.
local part = script.Parent
-- Create a handles object for this part
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- Manually specify the faces applicable for this handle
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- Alternatively, use the faces on which the part can be resized.
-- If part is a TrussPart with only two Size dimensions
-- of length 2, then ResizeableFaces will only have two
-- enabled faces. For other parts, all faces will be enabled.
handles.Faces = part.ResizeableFaces

RightSurface

读取并联

RightSurface 属性确定零件的 +X 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.RightSurfaceInput 确定了一个引擎的关键。

大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” ,那么一些表面类型包括关节、机器和步进电机会渲染一个 3D 装饰。 如果此属性在 属性 窗口中选择,它将在游戏世界中与 SurfaceSelection 的样子相似。

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

RootPriority

读取并联

此属性是一个数量在 -127 和 127 之间的整数,取得根部分排序的所有其他规则的优先权。当考虑多个不是 Anchored 和共享相同的 Massless 值的部分时,高级 RootPrivile

您可以使用此属性来控制装配件的哪个部分是根部分,如果大小发生变更,可以保持根部分稳定。

还请参阅组合,这是一个描述根部件和如何使用它们的文章。

Rotation

未复制
读取并联

三轴上的零件的旋转。

当设置此属性任何 WeldsMotor6Ds 连接到此部件时,将有相应的 C0 或 2>Class.JointInstance.C1|C12> 属性更新,允许该部件相对于任

焊接约束也将在移动工具动期间被禁用并重新启用。

未复制
读取并联

零件的 Size 属性确定其 视觉 尺寸,而 ExtentsSize 代表物理引擎使用的实际尺寸,例如在

零件的大小决定了它的质量,它的大小由 BasePart:GetMass() 决定。一个零件的 Size 被多个其他对象使用:

代码示例

Pyramid Builder

local TOWER_BASE_SIZE = 30
local position = Vector3.new(50, 50, 50)
local hue = math.random()
local color0 = Color3.fromHSV(hue, 1, 1)
local color1 = Color3.fromHSV((hue + 0.35) % 1, 1, 1)
local model = Instance.new("Model")
model.Name = "Tower"
for i = TOWER_BASE_SIZE, 1, -2 do
local part = Instance.new("Part")
part.Size = Vector3.new(i, 2, i)
part.Position = position
part.Anchored = true
part.Parent = model
-- Tween from color0 and color1
local perc = i / TOWER_BASE_SIZE
part.Color = Color3.new(
color0.R * perc + color1.R * (1 - perc),
color0.G * perc + color1.G * (1 - perc),
color0.B * perc + color1.B * (1 - perc)
)
position = position + Vector3.new(0, part.Size.Y, 0)
end
model.Parent = workspace
读取并联

顶表面属性确定零件的 +Y 方向使用的表面类型。当两个零件的面向放置在一起时,它们可能会创建一个共同的表面。如果设置为“Motor”,BasePart.TopSurfaceInput 确定发动机的共同行为。

大多数表面类型会在零件面上渲染一个材质,如果 BasePart.Material 设置为“塑料” 是。一些表面类型 - 关节、机器和步进电机 - 会在游戏世界中相似于 Class.SurfaceSelection 的 3D 装饰。如果这个属性在 属性 窗口中选择,它将在游戏世界中与 Class.SurfaceSelection 的 1 个相

代码示例

Show All SurfaceTypes

local demoPart = script.Parent
-- Create a billboard gui to display what the current surface type is
local billboard = Instance.new("BillboardGui")
billboard.AlwaysOnTop = true
billboard.Size = UDim2.new(0, 200, 0, 50)
billboard.Adornee = demoPart
local textLabel = Instance.new("TextLabel")
textLabel.Size = UDim2.new(0, 200, 0, 50)
textLabel.BackgroundTransparency = 1
textLabel.TextStrokeTransparency = 0
textLabel.TextColor3 = Color3.new(1, 1, 1) -- White
textLabel.Parent = billboard
billboard.Parent = demoPart
local function setAllSurfaces(part, surfaceType)
part.TopSurface = surfaceType
part.BottomSurface = surfaceType
part.LeftSurface = surfaceType
part.RightSurface = surfaceType
part.FrontSurface = surfaceType
part.BackSurface = surfaceType
end
while true do
-- Iterate through the different SurfaceTypes
for _, enum in pairs(Enum.SurfaceType:GetEnumItems()) do
textLabel.Text = enum.Name
setAllSurfaces(demoPart, enum)
task.wait(1)
end
end

Transparency

读取并联

透明度属性控制零到1的零件的可见度,其中0完全可见(不透明),值1完全不可见(不透明)。

BasePart.Reflectance 可以减少砖块的总透明度,如果将其设置为 1 附近的值。

尽管不透明零件不会在全部何情况下渲染,但部分半透明对象有一些显著的渲染成本。有许多半透明零件可能会减慢游戏的性能。

当透明零件交叉时,渲染顺序可能会变得不可预知 - 请尝试使半透明零件从交叉中保持透明,以避免这种情况。

Class.BasePart.LocalTransparency 是一个只对本地客户端可见的透明度修改器。

代码示例

Fade Door

-- Paste into a Script inside a tall part
local part = script.Parent
local OPEN_TIME = 1
-- Can the door be opened at the moment?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("Black")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("Bright blue")
end
local function onTouch(otherPart)
-- If the door was already open, do nothing
if debounce then
print("D")
return
end
-- Check if touched by a Humanoid
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("not human")
return
end
-- Perform the door opening sequence
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()
X-Ray Vision

local function makeXRayPart(part)
-- LocalTransparencyModifier will make parts see-through but only for the local
-- client, and it won't replicate to the server
part.LocalTransparencyModifier = 0.5
end
-- This function uses recursion to search for parts in the game
local function recurseForParts(object)
if object:IsA("BasePart") then
makeXRayPart(object)
end
-- Stop if this object has a Humanoid - we don't want to see-through players!
if object:FindFirstChildOfClass("Humanoid") then
return
end
-- Check the object's children for more parts
for _, child in pairs(object:GetChildren()) do
recurseForParts(child)
end
end
recurseForParts(workspace)

方法

AngularAccelerationToTorque

参数

angAcceleration: Vector3
angVelocity: Vector3
默认值:"0, 0, 0"

返回

ApplyAngularImpulse

void

应用角度力瞬间强度对该部件的装配,使装配旋转。

由导ulse产生的角度速度受到装配体的 mass 的影响。因此,需要更大的导ulse才能移动更大的装配体。导ulse 有助于在您想要立即施加力的情况下,例如爆炸或碰撞。

如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.

参数

impulse: Vector3

力量向量,应用于装配工序作为脉冲。


返回

void

ApplyImpulse

void

此函数将立即的驱动力脉冲应用到这部件的装配。

力应用在装配的 center of mass ,因此结果的移动只是直线。

由 impulse导致的速度受到装配工序的 mass 的影响。因此,需要更大的 impulse才能移动更大的装配工序。 impulses 对于您想要立即施加力的情况有用,例如爆炸或碰撞。

如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.

参数

impulse: Vector3

力量向量,应用于装配工序作为脉冲。


返回

void

ApplyImpulseAtPosition

void

此函数将即时的驱动力脉冲应用到该部件的装配,在世界空间的指定位置。

如果位置不在装配工序的 center of mass ,那么,脉冲会导致位置和旋转运动。

由 impulse导致的速度受到装配工序的 mass 的影响。因此,需要更大的 impulse才能移动更大的装配工序。 impulses 对于开发人员想要立即施加力的情况有用,例如爆炸或碰撞。

如果零件是由服务器拥有 的,此功能必须从服务器 Script (不是从 Class.

参数

impulse: Vector3

力量向量,应用于装配工序作为脉冲。

position: Vector3

在世界空间中的位置,以应用脉冲。


返回

void

CanCollideWith

写入并联

返回零件是否可以相互碰撞。 此函数考虑到两个零件的碰撞群。 此函数将在指定的零件不是 BasePart 的情况下发生错误。

参数

part: BasePart

检查是否可以拥有的部分。


返回

零件是否可以相互碰撞。

CanSetNetworkOwnership

CanSetNetworkOwnership 函数检查您是否可以设置零件的网络所有权。

该函数的返回值验证您是否可以调用 BasePart:SetNetworkOwner()BasePart:SetNetworkOwnershipAuto() 而不会遇到错误。它返回 true 如果您可以修改/读取网络所有权,或返回 false 和理由,为字符串。


返回

您可以修改或读取网络的所有权和原因。

代码示例

Check if a Part's Network Ownership Can Be Set

local part = workspace:FindFirstChild("Part")
if part and part:IsA("BasePart") then
local canSet, errorReason = part:CanSetNetworkOwnership()
if canSet then
print(part:GetFullName() .. "'s Network Ownership can be changed!")
else
warn("Cannot change the Network Ownership of " .. part:GetFullName() .. " because: " .. errorReason)
end
end

GetClosestPointOnSurface

参数

position: Vector3

返回

GetConnectedParts

Instances
写入并联

返回一个连接对象的零件表,通过任何类型的刚性关接头。

如果 recursive 是真的,这个函数将返回基地零件的所有部分。

刚性关节

当两个部分连接在一起时,(Part0 → Part1),一个共同体是硬 如果Part1 的物理学完全被2> Part02> 锁定,这只适用于以下共同体类型:

参数

recursive: bool

连接对象的任意种类的 joint 的表。

默认值:false

返回

Instances

GetJoints

Instances
写入并联

返回所有连接到此零件的关联或限制。


返回

Instances

一个连接到零件的所有共同或限制的阵列。

GetMass

写入并联

GetMass 返回 read-only Mass 属性的值。

此函数先前于“Mass”属性。它仍然支持与兼容性,您应该使用“Mass”属性直接。


返回

零件的质量。

代码示例

Finding a Part's Mass

local myPart = Instance.new("Part")
myPart.Size = Vector3.new(4, 6, 4)
myPart.Anchored = true
myPart.Parent = workspace
local myMass = myPart:GetMass()
print("My part's mass is " .. myMass)

GetNetworkOwner

写入并联

返回当前玩家,这是网络的主人,或者在服务器的情况下为零。


返回

当前玩家,是这个部分的网络所有者,或者在服务器的情况下为零。

GetNetworkOwnershipAuto

写入并联

如果游戏引擎自动决定网络所有者,返回 true。


返回

是否让游戏引擎自动为此部分的网络所有者。

GetNoCollisionConstraints

Instances

返回

Instances

GetRootPart

写入并联

返回组装的基础部分。 使用 CFrame 移动一个组装的零件时,很重要地移动这个基础部分(这将移动所有与它相关的零件)。 更多信息可以在 组装 文章中查看。

此函数先前于 AssemblyRootPart 属性。它仍然支持向后兼容,但您应该使用 AssemblyRootPart 直接。


返回

装配的基本部分(连接在一起的零件集)。

GetTouchingParts

Instances

返回包含所有物理交互部件的表。如果零件本身设置为 false,则此函数将返回一个空表,除非零件有 Class.TouchTransmitter|TouchInterest


返回

Instances

用于表示和描述与此部分可能相互碰撞的所有部分的表。

GetVelocityAtPosition

写入并联

返回该部件的组装在指定位置相对于该部件的实际位置的直线速度。它可以用于识别根部件以外的任何位置的直线速度。如果组装没有角度速度,那么直线速度将在每个位置都一致。

参数

position: Vector3

返回

IsGrounded

写入并联

如果对象连接到一个部件,该部件将它固定在一个地方 (例如一个 Anchored 部件),否则返回 false。在有 Anchored 部件的装配中,每个其他部件都是固定的。


返回

是否连接到将其固定在位场景的部件。

Resize

就像使用 Studio 调整对象大小。

参数

normalId: Enum.NormalId

要调整大小的页面。

deltaAmount: number

在指定的侧面上长大/缩小。


返回

是否要调整零件的大小。

SetNetworkOwner

void

将给予的玩家作为网络所有者为这个和所有连接的部分。当玩家实例为零时,服务器将作为所有者而不是玩家。

参数

playerInstance: Player

玩家被给予网络拥有部分的网络所有权。

默认值:"nil"

返回

void

SetNetworkOwnershipAuto

void

让游戏引擎动态地决定谁将处理零件的物理(客户端或服务器之一)。


返回

void

TorqueToAngularAcceleration

参数

torque: Vector3
angVelocity: Vector3
默认值:"0, 0, 0"

返回

IntersectAsync

暂停

从零件和其他零件在给定数组列中的交叉图中创建一个新的 IntersectOperation 。 只有 Parts 支持,不是 Class.Terrain 或 1> Class.MeshPart|MeshParts1> 。

调用部分的以下属性将适用于结果中的 IntersectOperation

在下面的图像比较中,IntersectAsync() 使用包含蓝色块的表调用紫色的方砖块。结果的IntersectOperation 解决为两个部分的交叉几何形状。

Two block parts overlapping

<figcaption>分离零件</figcaption>
Parts intersected into a new solid model

<figcaption>结果 <code>Class.IntersectOperation</code></figcaption>

注释

  • 原始部分在成功的交叉操作后保持完整。 在大多数情况下,您应该 Destroy() 所有原始部分和父级返回 IntersectOperation 到同一个地方, как调用 BasePart
  • 默认情况下,结果交叉点的面部颜色是从原始部件的 Color 属性借鉴。要将整个交叉点更改为特定颜色,请将其 UsePartColor 属性设置为 true
  • 如果交叉操作将导致超过 20,000 个三角形的零件,它将简化为 20,000 个三角形。

参数

parts: Instances

交叉点的对象。

collisionfidelity: Enum.CollisionFidelity
默认值:"Default"
renderFidelity: Enum.RenderFidelity
默认值:"Automatic"

返回

结果 IntersectOperation 使用默认名称 交叉

SubtractAsync

暂停

从零件中创建一个新的 UnionOperation 零件,减去占位零件在给定数组列中所占的几何。 只有 Parts 是支持的,不是 Terrain 或 1> Class.MeshPart|MeshParts

注意,结果的联合不能由于减法而为空。如果操作将导致完全空的几何体,它将会失败。

在以下图像比较中,SubtractAsync() 使用包含紫色砖块的表调用蓝色圆柱。结果的 UnionOperation 以形状结构为代码,从该圆砖块的几何形状解决为可以从该圆柱的几何形状解决的形式。

Longer block overlapping a cylinder

<figcaption>分离零件</figcaption>
Block part subtracted from cylinder

<figcaption>结果 <code>Class.UnionOperation</code></figcaption>

参数

parts: Instances

参与摧毁的对象。

collisionfidelity: Enum.CollisionFidelity
默认值:"Default"
renderFidelity: Enum.RenderFidelity
默认值:"Automatic"

返回

结果 UnionOperation 用默认名称 联合

代码示例

BasePart:SubtractAsync()

local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Perform subtract operation
local success, newSubtract = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newSubtract then
newSubtract.Position = mainPart.Position
newSubtract.Parent = Workspace
end
-- Destroy original parts which remain intact after operation
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end

UnionAsync

暂停

从零件中创建一个新的 UnionOperation ,并且在指定的数组列中占用零件。 只有 Parts 支持,不是 Terrain 或 1> Class.MeshPart|MeshParts1> 。 与

调用部分的以下属性将适用于结果的 UnionOperation

在下图中,UnionAsync() 使用包含紫色圆柱体的表调用蓝色块。结果的UnionOperation 解决为两个部分的组合几何形状。

Block and cylinder parts overlapping

<figcaption>分离零件</figcaption>
Parts joined together into a single solid union

<figcaption>结果 <code>Class.UnionOperation</code></figcaption>

注释

  • 原始部分在成功的联合操作后保持完整。 在大多数情况下,您应该 Destroy() 所有原始部分和父级返回 UnionOperation 到同一个地方, как调用 BasePart
  • 默认情况下,结果的联合部分尊重每个部分的 Color 属性。要将整个联合部分更改为特定颜色,请将其 UsePartColor 属性设置为 true
  • 如果联合操作将导致一个部分超过 20,000 个三角形,它将简化为 20,000 个三角形。

参数

parts: Instances

参与调用方的对象。

collisionfidelity: Enum.CollisionFidelity
默认值:"Default"
renderFidelity: Enum.RenderFidelity
默认值:"Automatic"

返回

结果 UnionOperation 用默认名称 联合

代码示例

BasePart:UnionAsync()

local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- Perform union operation
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- If operation succeeds, position it at the same location and parent it to the workspace
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = Workspace
end
-- Destroy original parts which remain intact after operation
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end

活动

TouchEnded

在触摸其他部件时,当一个部件停止触摸另一个部件时,它会发生。

此事件与 Workspace.TouchesUseCollisionGroups 合作,以确定是否要认证 CollisionGroups 作为检测。

参数

otherPart: BasePart

代码示例

Touching Parts Count

local part = script.Parent
local billboardGui = Instance.new("BillboardGui")
billboardGui.Size = UDim2.new(0, 200, 0, 50)
billboardGui.Adornee = part
billboardGui.AlwaysOnTop = true
billboardGui.Parent = part
local tl = Instance.new("TextLabel")
tl.Size = UDim2.new(1, 0, 1, 0)
tl.BackgroundTransparency = 1
tl.Parent = billboardGui
local numTouchingParts = 0
local function onTouch(otherPart)
print("Touch started: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Touch ended: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)

Touched

触摸事件发生,当零件与另一个零件接触时。例实例,如果 零件A 撞到 零件B,那么 Class.BasePart.Touched|PartA.Touched 就会发生 2> PartB2> ,而

此事件仅发生于物理运动的结果,因此在 CFrame 属性被更改为覆盖另一个部分时,它不会发生。这也意味着在碰撞时至少一个部分必须不是 Class.BasePart.Anchored|Anchored

此事件与 Workspace.TouchesUseCollisionGroups 合作,以确定是否要认证 CollisionGroups 作为检测。

参数

otherPart: BasePart

与给定部分接触的其他部分。


代码示例

Touching Parts Count

local part = script.Parent
local billboardGui = Instance.new("BillboardGui")
billboardGui.Size = UDim2.new(0, 200, 0, 50)
billboardGui.Adornee = part
billboardGui.AlwaysOnTop = true
billboardGui.Parent = part
local tl = Instance.new("TextLabel")
tl.Size = UDim2.new(1, 0, 1, 0)
tl.BackgroundTransparency = 1
tl.Parent = billboardGui
local numTouchingParts = 0
local function onTouch(otherPart)
print("Touch started: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("Touch ended: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
Model Touched

local model = script.Parent
local function onTouched(otherPart)
-- Ignore instances of the model coming in contact with itself
if otherPart:IsDescendantOf(model) then return end
print(model.Name .. " collided with " .. otherPart.Name)
end
for _, child in pairs(model:GetChildren()) do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
end
end