主题
BasePart
BasePart 是具备物理碰撞与渲染表现的立体组件基类,向上承接 SpaceUnit 的层级能力,向下为 WorldUnit、RenderUnit、HumanUnit 等子类提供统一的变换、尺寸、外观与装配体信息。它通过 CFrame、P...
概览
BasePart 是具备物理碰撞与渲染表现的立体组件基类,向上承接 SpaceUnit 的层级能力,向下为 WorldUnit、RenderUnit、HumanUnit 等子类提供统一的变换、尺寸、外观与装配体信息。它通过 CFrame、PivotOffset、Position、Rotation、Scale、Size 描述空间形态,通过 ModelAlpha、ModelVisible、CastShadow、ModelColor1 至 ModelColor4、SkinId 与自定义外观相关属性控制显示效果,并暴露装配体线速度、角速度、质量、质心等装配体状态,以及网络所有权归属和焊接连接关系的判定接口。
继承自
SpaceUnit;不可实例化,由接口返回
函数
IsNetworkOwnerSide
签名:IsNetworkOwnerSide() -> Bool
判断当前端是否为该单位的物理拥有者端。
返回值 Bool
调用 IsNetworkOwnerSide
lua
-- @runtime client
local function demo(basePart)
if basePart ~= nil then
local result = basePart:IsNetworkOwnerSide() -- 返回 Bool
if result then
print("调用结果为 true")
else
print("调用结果为 false")
end
end
endGetNetworkOwner
签名:GetNetworkOwner() -> Player
获取当前 BasePart 实例的物理拥有者,返回表示该部件的物理拥有者的 Player 对象。
返回值 Player
服务端读取网络所有者
lua
-- @runtime server
local World = game:GetService('World')
local part = World:CreateUnit('WorldUnit', {
Position = Vector3.New(0, 5, 0),
PhysicsActive = true,
})
local owner = part:GetNetworkOwner()
if owner ~= nil then
print('网络所有者:', owner:GetName())
else
print('当前没有指定网络所有者')
end
part:Destroy()SetNetworkOwner
签名:SetNetworkOwner(player: Player)
将 BasePart 的网络物理拥有者设置为指定的 Player。调用后该部件在网络同步中的物理模拟归属由被传入的玩家承担;传入的 player 参数必须是 Player 类型对象,函数没有返回值。可通过同一类型的 GetNetworkOwner 查询当前拥有者,通过 GetNetworkOwnershipAuto 与 SetNetworkOwnershipAuto 管理是否自动分配拥有权,也可通过 IsNetworkOwnerSide 判断本端是否为拥有方。
| 参数 | 类型 | 说明 |
|---|---|---|
player | Player | 玩家 |
服务端设置网络所有者
lua
-- @runtime server
local Players = game:GetService('Players')
local World = game:GetService('World')
local player = Players:GetPlayers()[1]
if player ~= nil then
local part = World:CreateUnit('WorldUnit', {
Position = Vector3.New(0, 5, 0),
PhysicsActive = true,
})
part:SetNetworkOwner(player)
print('已设置网络所有者:', player:GetName())
part:Destroy()
endGetNetworkOwnershipAuto
签名:GetNetworkOwnershipAuto() -> Bool
返回该物体的物理拥有者是否由引擎自动决定。返回 true 表示引擎会在玩家感知/接触时自动分配所有权;返回 false 表示已被手动固定(SetNetworkOwner 会隐式切为手动)
返回值 Bool
服务端查询网络所有权分配模式
lua
-- @runtime server
local World = game:GetService('World')
local part = World:CreateUnit('WorldUnit', { PhysicsActive = true })
if part == nil then return end
print('是否自动分配网络所有者:', part:GetNetworkOwnershipAuto())
part:Destroy()SetNetworkOwnershipAuto
签名:SetNetworkOwnershipAuto()
把该部件的物理拥有者设置为自动分配模式,函数没有返回值。
服务端恢复网络所有权自动分配
lua
-- @runtime server
local World = game:GetService('World')
local part = World:CreateUnit('WorldUnit', { PhysicsActive = true })
if part == nil then return end
print('调用前是否自动分配:', part:GetNetworkOwnershipAuto())
part:SetNetworkOwnershipAuto()
print('恢复自动分配:', part:GetNetworkOwnershipAuto())
part:Destroy()IsWeldConstraintRoot
签名:IsWeldConstraintRoot() -> Bool
判断该单位是否为焊接约束的根单位。
返回值 Bool
查询部件是否为焊接装配体根单位
lua
-- @runtime client
local World = game:GetService('World')
local part = World:CreateUnit('WorldUnit', {})
if part == nil then return end
print('是否为焊接根单位:', part:IsWeldConstraintRoot())
part:Destroy()IsWeldConstraintChild
签名:IsWeldConstraintChild() -> Bool
判断该单位是否为焊接约束的子单位。
返回值 Bool
查询部件是否为焊接装配体子单位
lua
-- @runtime client
local World = game:GetService('World')
local part = World:CreateUnit('WorldUnit', {})
if part == nil then return end
print('是否为焊接子单位:', part:IsWeldConstraintChild())
part:Destroy()GetConnectedUnits
签名:GetConnectedUnits() -> Map
获取通过约束与该部件连接的所有单位,返回一个键为整型索引、值为 WorldUnit 的映射表。
返回值 Map
调用 GetConnectedUnits
lua
-- @runtime client
local function demo(basePart)
if basePart ~= nil then
local result = basePart:GetConnectedUnits() -- 返回 Map
if result ~= nil then
for key, item in pairs(result) do
print(key, item)
end
end
end
endSyncRenderToPhysics
签名:SyncRenderToPhysics()
将本地渲染位置强制同步到最新的物理模拟位置,消除渲染延迟
属性
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
CFrame | CFrame | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0] | BasePart 的空间变换属性,类型为 CFrame,同时表达该部件的位置与旋转信息。 |
PivotOffset | CFrame | [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0] | BasePart 的轴心偏移属性,类型为 CFrame,用于描述部件轴心相对于默认轴心的偏移变换。 |
Position | Vector3 | [0.0, 0.0, 0.0] | 单位在世界空间中的位置坐标。该属性为 CFrame 的语法糖:读取等价于 CFrame.Position,写入会保持当前旋转不变、仅重建 CFrame 的位置分量 |
Rotation | Quaternion | [0.0, 0.0, 0.0, 1.0] | 单位在世界空间中的旋转,以四元数表示。该属性为 CFrame 的语法糖:读取等价于 CFrame.Rotation,写入会保持当前位置不变、仅重建 CFrame 的旋转分量 |
Scale | Vector3 | [1.0, 1.0, 1.0] | BasePart 的缩放属性,类型为 Vector3,用于描述部件在各轴向上的缩放。 |
Size | Vector3 | - | 渲染层尺寸,由 Scale 与模型资源的基础尺寸决定;无模型时为 nil。修改 Scale 或模型可改变渲染尺寸。 |
ModelAlpha | Float | 1 | 控制模型的整体透明度,0 为完全透明,1 为完全不透明 |
ModelVisible | Bool | true | 控制模型是否可见,隐藏后仍参与物理碰撞 |
CastShadow | Bool | true | 该单位是否投射阴影,类型为 Bool,默认值为 true。 |
ModelColor1 | Color | Color.New(255, 255, 255, 255) | 染色区域 1 的颜色;实际效果依赖模型资源是否包含对应 color mask,部分资源可能忽略 Color 赋值或表现为白色。启用自定义外观后该属性不生效。 |
ModelColor2 | Color | Color.New(255, 255, 255, 255) | 染色区域 2 的颜色;实际效果依赖模型资源是否包含对应 color mask。启用自定义外观后该属性不生效。 |
ModelColor3 | Color | Color.New(255, 255, 255, 255) | 染色区域 3 的颜色;实际效果依赖模型资源是否包含对应 color mask。启用自定义外观后该属性不生效。 |
ModelColor4 | Color | Color.New(255, 255, 255, 255) | 染色区域 4 的颜色;实际效果依赖模型资源是否包含对应 color mask。启用自定义外观后该属性不生效。 |
SkinId | String | "" | 模型使用的皮肤资源ID,用于切换模型外观;启用自定义外观后该属性不生效 |
UseCustomAppearance | Bool | false | 单位是否使用自定义外观,类型为 Bool,默认值为 false。 |
CustomAppearanceId | String | "" | 自定义外观的资源ID,启用自定义外观后生效 |
OcclusionType | Int | 3 | 该单位遮挡玩家时采用的处理规则;Meta 将类型声明为 Int,默认值为 3(不处理)。 |
AssemblyRootPriority | Int | 0 | 在装配体中作为根节点的优先级,数值越大越优先成为装配体根;取值范围 [-127, 127]。 |
AssemblyLinearVelocity | Vector3 | [0, 0, 0] | 所属装配体的整体线速度(只读) |
AssemblyAngularVelocity | Vector3 | [0, 0, 0] | 所属装配体的整体角速度(只读) |
AssemblyMass | Float | 0 | 所属装配体的总质量(只读) |
AssemblyCenterOfMass | Vector3 | [0, 0, 0] | 所属装配体的质心世界坐标(只读) |
Persistent | Bool | false | 仅在World开启了AOI功能时此字段生效 |
IsStaticOptimization | Bool | false | 启用后标记为静态物体,引擎可进行批量渲染优化,适用于不会移动的物体 |
