BasePart

显示已弃用

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

无法创建
不可浏览

BasePart 是一个在 Workspace 内渲染并被物理模拟的世界对象的抽象基类。BasePart 有多个实现,最常见的是 PartMeshPart。其他的包括 WedgePartSpawnLocation 和单例的 Terrain 对象。通常,当文档提到“部件”时,大多数 BasePart 实现都会起作用,而不仅仅是 Part

有关如何将 BaseParts 分组到模拟刚体的信息,请参见 Assemblies

许多不同的对象与 BasePart 交互(除了 Terrain),包括:

概要

属性

继承自PVInstance的属性

属性

方法

继承自PVInstance的方法

方法

活动

属性

Anchored

读取并联

代码示例

部件固定切换

local part = script.Parent
-- 创建一个 ClickDetector,以便我们可以知道部件何时被点击
local cd = Instance.new("ClickDetector", part)
-- 此函数根据部件的 Anchored 状态更新部件的外观
local function updateVisuals()
if part.Anchored then
-- 当部件已固定时...
part.BrickColor = BrickColor.new("鲜红")
part.Material = Enum.Material.DiamondPlate
else
-- 当部件未固定时...
part.BrickColor = BrickColor.new("鲜黄色")
part.Material = Enum.Material.Wood
end
end
local function onToggle()
-- 切换固定属性
part.Anchored = not part.Anchored
-- 更新砖块的视觉状态
updateVisuals()
end
-- 更新后,开始监听点击
updateVisuals()
cd.MouseClick:Connect(onToggle)

AssemblyAngularVelocity

未复制
读取并联

AssemblyCenterOfMass

只读
未复制
读取并联

AssemblyLinearVelocity

未复制
读取并联

AssemblyMass

只读
未复制
读取并联

AssemblyRootPart

只读
未复制
读取并联

AudioCanCollide

读取并联

BackSurface

读取并联

BottomSurface

读取并联

BrickColor

未复制
读取并联

CFrame

读取并联

代码示例

设置零件 CFrame

local part = script.Parent:WaitForChild("Part")
local otherPart = script.Parent:WaitForChild("OtherPart")
-- 将零件的 CFrame 重置为 (0, 0, 0),没有旋转。
-- 这有时被称为“单位”CFrame
part.CFrame = CFrame.new()
-- 设置为特定位置 (X, Y, Z)
part.CFrame = CFrame.new(0, 25, 10)
-- 与上面相同,但使用 Vector3
local point = Vector3.new(0, 25, 10)
part.CFrame = CFrame.new(point)
-- 将零件的 CFrame 设置为位于一个点,面向另一个点
local lookAtPoint = Vector3.new(0, 20, 15)
part.CFrame = CFrame.lookAt(point, lookAtPoint)
-- 在本地 X 轴上将零件的 CFrame 旋转 pi/2 弧度
part.CFrame = part.CFrame * CFrame.Angles(math.pi / 2, 0, 0)
-- 在本地 Y 轴上将零件的 CFrame 旋转 45 度
part.CFrame = part.CFrame * CFrame.Angles(0, math.rad(45), 0)
-- 在全局 Z 轴上将零件的 CFrame 旋转 180 度(注意顺序!)
part.CFrame = CFrame.Angles(0, 0, math.pi) * part.CFrame -- Pi 弧度等于 180 度
-- 组合两个 CFrame 使用 *(乘法运算符)
part.CFrame = CFrame.new(2, 3, 4) * CFrame.new(4, 5, 6) --> 等于 CFrame.new(6, 8, 10)
-- 与代数乘法不同,CFrame 组合不是交换的:a * b 不一定等于 b * a!
-- 想象 * 为一系列有序的动作。例如,以下行产生不同的 CFrame:
-- 1) 将零件在 X 轴上滑动 5 个单位。
-- 2) 绕 Y 轴将零件旋转 45 度。
part.CFrame = CFrame.new(5, 0, 0) * CFrame.Angles(0, math.rad(45), 0)
-- 1) 绕 Y 轴将零件旋转 45 度。
-- 2) 将零件在 X 轴上滑动 5 个单位。
part.CFrame = CFrame.Angles(0, math.rad(45), 0) * CFrame.new(5, 0, 0)
-- 没有“CFrame 除法”,而是简单地“执行逆操作”。
part.CFrame = CFrame.new(4, 5, 6) * CFrame.new(4, 5, 6):Inverse() --> 等于 CFrame.new(0, 0, 0)
part.CFrame = CFrame.Angles(0, 0, math.pi) * CFrame.Angles(0, 0, math.pi):Inverse() --> 等于 CFrame.Angles(0, 0, 0)
-- 将一个零件相对于另一个零件放置(在这种情况下,将我们的零件放在 otherPart 上面)
part.CFrame = otherPart.CFrame * CFrame.new(0, part.Size.Y / 2 + otherPart.Size.Y / 2, 0)

CanCollide

读取并联

代码示例

褪色门

-- 粘贴到一个高部件的脚本中
local part = script.Parent
local OPEN_TIME = 1
-- 这个门现在可以打开吗?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("黑色")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("亮蓝色")
end
local function onTouch(otherPart)
-- 如果门已经打开,则不执行任何操作
if debounce then
print("D")
return
end
-- 检查是否被类人角色触碰
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("不是类人角色")
return
end
-- 执行门打开序列
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()

CanQuery

读取并联

CanTouch

读取并联

CastShadow

读取并联

CenterOfMass

只读
未复制
读取并联

CollisionGroup

未复制
读取并联

代码示例

物理服务:注册碰撞组

local PhysicsService = game:GetService("PhysicsService")
local collisionGroupBall = "CollisionGroupBall"
local collisionGroupDoor = "CollisionGroupDoor"
-- 注册碰撞组
PhysicsService:RegisterCollisionGroup(collisionGroupBall)
PhysicsService:RegisterCollisionGroup(collisionGroupDoor)
-- 将部分分配给碰撞组
script.Parent.BallPart.CollisionGroup = collisionGroupBall
script.Parent.DoorPart.CollisionGroup = collisionGroupDoor
-- 设置组之间为不可相撞并检查结果
PhysicsService:CollisionGroupSetCollidable(collisionGroupBall, collisionGroupDoor, false)
print(PhysicsService:CollisionGroupsAreCollidable(collisionGroupBall, collisionGroupDoor)) --> false

Color

未复制
读取并联

代码示例

角色健康身体颜色

-- 粘贴到 StarterCharacterScripts 中的一个脚本内
-- 然后播放游戏,并调整你角色的健康值
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
-- 根据你的健康百分比插值生成颜色
-- 颜色从 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

读取并联

代码示例

设置自定义物理属性

local part = script.Parent
-- 这将使部件变得轻且有弹性!
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

读取并联

ExtentsCFrame

只读
未复制
读取并联

ExtentsSize

只读
未复制
读取并联

FrontSurface

读取并联

LeftSurface

读取并联

LocalTransparencyModifier

隐藏
未复制
读取并联

Locked

读取并联

代码示例

递归解锁

-- 粘贴到您想要解锁的模型中的脚本内
local model = script.Parent
-- 此函数通过模型的层级结构递归并解锁
-- 它遇到的每个部分。
local function recursiveUnlock(object)
if object:IsA("BasePart") then
object.Locked = false
end
-- 在对象的子级上调用相同的函数
-- 如果对象没有子级,递归过程将停止
for _, child in pairs(object:GetChildren()) do
recursiveUnlock(child)
end
end
recursiveUnlock(model)

Mass

只读
未复制
读取并联

Massless

读取并联
读取并联

MaterialVariant

未复制
读取并联

Orientation

隐藏
未复制
读取并联

代码示例

部件旋转器

local part = script.Parent
local INCREMENT = 360 / 20
-- 不断旋转部件
while true do
for degrees = 0, 360, INCREMENT do
-- 仅设置Y轴旋转
part.Rotation = Vector3.new(0, degrees, 0)
-- 更好的方法是设置CFrame
--part.CFrame = CFrame.new(part.Position) * CFrame.Angles(0, math.rad(degrees), 0)
task.wait()
end
end

PivotOffset

读取并联

代码示例

重置支点

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)
时钟指针

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
-- 创建表盘
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
-- 创建指针
local hourHand = createHand(7, 1, 0)
local minuteHand = createHand(10, 0.6, 0.1)
local secondHand = createHand(11, 0.2, 0.2)
-- 运行时钟
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

隐藏
未复制
读取并联

ReceiveAge

隐藏
只读
未复制
读取并联

Reflectance

读取并联

ResizeIncrement

只读
未复制
读取并联

ResizeableFaces

只读
未复制
读取并联

代码示例

改变大小的控制点

-- 将此脚本放置在几种类型的 BasePart 中,例如
-- Part、TrussPart、WedgePart、CornerWedgePart 等。
local part = script.Parent
-- 为这个部件创建一个控制点对象
local handles = Instance.new("Handles")
handles.Adornee = part
handles.Parent = part
-- 手动指定适用此控制点的面
handles.Faces = Faces.new(Enum.NormalId.Top, Enum.NormalId.Front, Enum.NormalId.Left)
-- 或者,使用该部件可以调整大小的面。
-- 如果该部件是只有两个大小维度的 TrussPart
-- 且长度为 2,则可调整面将只有两个
-- 启用的面。对于其他部件,将启用所有面。
handles.Faces = part.ResizeableFaces

RightSurface

读取并联

RootPriority

读取并联

Rotation

未复制
读取并联
未复制
读取并联

代码示例

金字塔构建器

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
-- 从 color0 到 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
读取并联

Transparency

读取并联

代码示例

褪色门

-- 粘贴到一个高部件的脚本中
local part = script.Parent
local OPEN_TIME = 1
-- 这个门现在可以打开吗?
local debounce = false
local function open()
part.CanCollide = false
part.Transparency = 0.7
part.BrickColor = BrickColor.new("黑色")
end
local function close()
part.CanCollide = true
part.Transparency = 0
part.BrickColor = BrickColor.new("亮蓝色")
end
local function onTouch(otherPart)
-- 如果门已经打开,则不执行任何操作
if debounce then
print("D")
return
end
-- 检查是否被类人角色触碰
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if not human then
print("不是类人角色")
return
end
-- 执行门打开序列
debounce = true
open()
task.wait(OPEN_TIME)
close()
debounce = false
end
part.Touched:Connect(onTouch)
close()

方法

AngularAccelerationToTorque

参数

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

返回

ApplyAngularImpulse

()

参数

impulse: Vector3

返回

()

ApplyImpulse

()

参数

impulse: Vector3

返回

()

ApplyImpulseAtPosition

()

参数

impulse: Vector3
position: Vector3

返回

()

CanCollideWith

写入并联

参数

part: BasePart

返回

CanSetNetworkOwnership


返回

代码示例

检查一个部件的网络所有权是否可以被设置

local part = workspace:FindFirstChild("Part")
if part and part:IsA("BasePart") then
local canSet, errorReason = part:CanSetNetworkOwnership()
if canSet then
print(part:GetFullName() .. "的网络所有权可以被更改!")
else
warn("无法更改" .. part:GetFullName() .. "的网络所有权,因为:" .. errorReason)
end
end

GetClosestPointOnSurface

参数

position: Vector3

返回

GetConnectedParts

Instances
写入并联

参数

recursive: boolean
默认值:false

返回

Instances

GetJoints

Instances
写入并联

返回

Instances

GetMass

写入并联

返回

代码示例

查找零件的质量

local myPart = Instance.new("Part")
myPart.Size = Vector3.new(4, 6, 4)
myPart.Anchored = true
myPart.Parent = workspace
local myMass = myPart:GetMass()
print("我零件的质量是 " .. myMass)

GetNetworkOwner

写入并联

返回

GetNetworkOwnershipAuto

写入并联

返回

GetNoCollisionConstraints

Instances

返回

Instances

GetTouchingParts

Instances

返回

Instances

GetVelocityAtPosition

写入并联

参数

position: Vector3

返回

IntersectAsync

暂停

参数

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

返回

IsGrounded

写入并联

返回

Resize

参数

normalId: Enum.NormalId
deltaAmount: number

返回

SetNetworkOwner

()

参数

playerInstance: Player
默认值:"nil"

返回

()

SetNetworkOwnershipAuto

()

返回

()

SubtractAsync

暂停

参数

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

返回

代码示例

BasePart:SubtractAsync()

local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- 执行减法操作
local success, newSubtract = pcall(function()
return mainPart:SubtractAsync(otherParts)
end)
-- 如果操作成功,将其放置在相同的位置并将其父级设为工作区
if success and newSubtract then
newSubtract.Position = mainPart.Position
newSubtract.Parent = Workspace
end
-- 销毁操作后保持完整的原始部分
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end

TorqueToAngularAcceleration

参数

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

返回

UnionAsync

暂停

参数

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

返回

代码示例

BasePart:UnionAsync()

local Workspace = game:GetService("Workspace")
local mainPart = script.Parent.PartA
local otherParts = { script.Parent.PartB, script.Parent.PartC }
-- 执行联合操作
local success, newUnion = pcall(function()
return mainPart:UnionAsync(otherParts)
end)
-- 如果操作成功,将其放置在相同位置并将其父对象设置为工作区
if success and newUnion then
newUnion.Position = mainPart.Position
newUnion.Parent = Workspace
end
-- 销毁在操作后保持完好的原始部分
mainPart:Destroy()
for _, part in otherParts do
part:Destroy()
end

活动

TouchEnded

参数

otherPart: BasePart

代码示例

接触部件数量

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("开始接触: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("接触结束: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)

Touched

参数

otherPart: BasePart

代码示例

接触部件数量

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("开始接触: " .. otherPart.Name)
numTouchingParts = numTouchingParts + 1
tl.Text = numTouchingParts
end
local function onTouchEnded(otherPart)
print("接触结束: " .. otherPart.Name)
numTouchingParts = numTouchingParts - 1
tl.Text = numTouchingParts
end
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
模型触碰

local model = script.Parent
local function onTouched(otherPart)
-- 忽略与模型本身接触的实例
if otherPart:IsDescendantOf(model) then
return
end
print(model.Name .. " 与 " .. otherPart.Name .. " 碰撞")
end
for _, child in pairs(model:GetChildren()) do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
end
end