主题
SpaceUnit
概览
| 字段 | 值 |
|---|---|
| Kind | Unit · 单位 Unit |
| Realm | common |
继承关系
- Unit(4 属性 / 25 函数 / 6 事件)
- [SpaceUnit](2 属性 / 9 函数)
- BasePart(24 属性 / 9 函数)
- PhysicsUnit(21 属性 / 15 函数 / 4 事件)
- RenderUnit(17 属性 / 1 函数)
- SeatUnit(3 属性 / 1 事件)
- SurfaceGui(8 属性)
- TriggerUnit(8 属性 / 7 函数 / 4 事件)
- RenderTriggerUnit(18 属性 / 1 函数)
- WorldUnit(31 属性 / 16 函数 / 6 事件)
- AnimatedUnit(3 函数)
- SpawnLocationUnit(8 属性)
- CameraUnit(22 属性 / 2 函数 / 1 事件)
- EggyUnit(12 属性 / 12 函数)
- FindingPathUnit(1 属性 / 4 函数)
- HumanUnit(26 属性 / 27 函数 / 2 事件)
- ModelUnit(4 属性 / 1 函数)
- BasePart(24 属性 / 9 函数)
- [SpaceUnit](2 属性 / 9 函数)
继承成员
1 个来源 / 4 属性 / 25 函数 / 6 事件
- 来自 Unit(4 属性 / 25 函数 / 6 事件)
- 属性:
AssetId、Name、Desc、Parent - 函数:
ClearAllChildren、GetChildren、GetDescendants、IsAncestorOf、IsDescendantOf、FindFirstAncestor、FindFirstAncestorWhichIsA、FindFirstAncestorOfClass、FindFirstChild、FindFirstChildWhichIsA、FindFirstChildOfClass、HasChildren、GetChildCount、GetChildAtIndex、SetAttribute、GetAttribute、GetAllProps、Clone、IsA、Destroy、GetPropertyChangedSignal、GetAttributeChangedSignal、FindFromPath、GetFullPath、GetDebugId - 事件:
ChildAdded、ChildRemoved、DescendantAdded、DescendantRemoving、AncestryChanged、Destroying
- 属性:
空间单位的公共基类,为所有存在于三维世界中的单位统一提供轴心变换、标签管理与空间层级查询能力。它以轴心为核心完成整体的位置与朝向调整,支持沿自身局部坐标系做相对位移,并可按名称增删与查询标签。判断对象是否处于层级顶层或向上查找顶层对象也由它负责。
适用场景
在场景中创建好具体单位后,需要把它们当作一个整体搬动或打上分组标记时使用,例如将一个模型单位移动到目标轴心位置再补充标签,便于后续按标签统一处理。
使用要点
SpaceUnit 不能直接创建,应先通过 world:CreateUnit("WorldUnit", {...}) 或 world:CreateUnit("TriggerUnit", {...}) 得到具体子类实例,再调用其继承来的能力。读取整体变换用 GetPivot 拿到 CFrame,整体设置用 PivotTo,做相对调整用 ApplyPivotDelta,需要沿对象自身坐标系平移则用 TranslateBy。标签相关操作按 HasTag、AddTag、RemoveTag 的顺序按需调用,层级判断使用 IsTopLevel 与 FindTopLevel。
注意事项
SpaceUnit 是不可直接创建的空间基类,应创建 WorldUnit、TriggerUnit 等公开具体子类后使用其继承能力。TranslateBy(delta) 沿对象自身坐标系平移,不是世界坐标系;例如对象旋转后,TranslateBy(Vector3.New(0, 0, 1)) 会沿对象本地 Z 轴移动。轴心读写只使用当前公开的 GetPivot、PivotTo 与 ApplyPivotDelta。
代码示例
用具体空间单位调用 SpaceUnit 能力
lua
-- @runtime client
local world = game:GetService("World")
-- SpaceUnit 是基类,脚本中创建具体子类(例如 TriggerUnit)后使用继承能力
local unit = world:CreateUnit("TriggerUnit", {
Name = "TaggedTrigger",
Position = Vector3.New(0, 5, 0),
Scale = Vector3.New(3, 2, 1),
})
unit:AddTag("checkpoint")
if unit:HasTag("checkpoint") then
unit:TranslateBy(Vector3.New(0, 0, 1))
end
local pivot = unit:GetPivot()
unit:PivotTo(pivot * CFrame.New(0, 0, 2))属性 (2)
| Name | 类型 | 默认值 | 说明 |
|---|---|---|---|
Tags | Array<String> | [] | SpaceUnit 的标签属性,标题为“标签”,用于表示组件拥有的标签,类型为 Array,默认值为空数组。 |
EcaPath | String | "" | SpaceUnit 的触发器路径属性,标题为“触发器路径”,类型为 String,默认值为空字符串。 |
关联类型
函数 (9)
HasTag
签名:HasTag(tag: String) -> Bool (是否拥有指定标签)
判断 SpaceUnit 是否拥有指定标签,返回 Bool 表示是否拥有该标签。
| 参数 | 类型 | 说明 |
|---|---|---|
tag | String | 要检查的标签名称 |
返回值 Bool (是否拥有指定标签)
示例代码
检查具体空间单位标签
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Name = "Checkpoint" })
unit:AddTag("checkpoint")
if unit:HasTag("checkpoint") then
print("已标记为检查点")
endAddTag
签名:AddTag(tag: String) -> void
为 SpaceUnit 增加一个标签,标签以字符串形式传入;调用后该标签会被加入该对象的标签集合。
| 参数 | 类型 | 说明 |
|---|---|---|
tag | String | 要添加的标签名称 |
返回值 void
示例代码
给具体空间单位添加标签
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Name = "Checkpoint" })
unit:AddTag("checkpoint")
print("标签已添加:", unit:HasTag("checkpoint"))RemoveTag
签名:RemoveTag(tag: String) -> void
为 SpaceUnit 移除一个标签,标签以字符串形式传入,调用后会从该对象的标签集合中删除对应标签。
| 参数 | 类型 | 说明 |
|---|---|---|
tag | String | 要移除的标签名称 |
返回值 void
示例代码
移除具体空间单位标签
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Name = "Checkpoint" })
unit:AddTag("checkpoint")
unit:RemoveTag("checkpoint")
print("是否仍有标签:", unit:HasTag("checkpoint"))GetPivot
签名:GetPivot() -> CFrame (轴心点的坐标变换矩阵)
获取 SpaceUnit 轴心点的坐标变换矩阵,返回值为 CFrame。
返回值 CFrame (轴心点的坐标变换矩阵)
示例代码
读取具体空间单位轴心
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Position = Vector3.New(0, 5, 0) })
local pivot = unit:GetPivot()
print("当前轴心:", pivot)PivotTo
签名:PivotTo(cframe: CFrame) -> void
将 SpaceUnit 的轴心变换设置为指定的 CFrame,参数 cframe 为目标轴心变换。
| 参数 | 类型 | 说明 |
|---|---|---|
cframe | CFrame | 目标轴心点的坐标变换矩阵 |
返回值 void
示例代码
设置具体空间单位轴心
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Position = Vector3.New(0, 5, 0) })
unit:PivotTo(CFrame.New(0, 5, 2))
print("已移动到新轴心")ApplyPivotDelta
签名:ApplyPivotDelta(delta: CFrame) -> void
对 SpaceUnit 的轴心应用一个由 CFrame 表示的增量变换,参数 delta 即为该增量变换矩阵。
| 参数 | 类型 | 说明 |
|---|---|---|
delta | CFrame | 要施加的增量 CFrame 变换 |
返回值 void
示例代码
对具体空间单位应用轴心增量
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Position = Vector3.New(0, 5, 0) })
unit:ApplyPivotDelta(CFrame.New(0, 0, 2))
print("已按当前轴心增量移动")TranslateBy
签名:TranslateBy(delta: Vector3) -> void
按对象自身坐标系中的 delta 向量平移当前 SpaceUnit。
| 参数 | 类型 | 说明 |
|---|---|---|
delta | Vector3 | 在对象自身坐标系下的平移向量 |
返回值 void
示例代码
沿本地坐标移动具体空间单位
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Position = Vector3.New(0, 5, 0) })
unit:TranslateBy(Vector3.New(0, 0, 1))
print("已沿自身前方移动")IsTopLevel
签名:IsTopLevel() -> Bool (是否为顶层对象)
判断 SpaceUnit 是否为顶层对象,返回 Bool 表示是否为顶层对象。
返回值 Bool (是否为顶层对象)
示例代码
判断具体空间单位是否顶层
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Name = "TopLevelTrigger" })
if unit:IsTopLevel() then
print("该单位位于当前层级顶层")
endFindTopLevel
签名:FindTopLevel() -> SpaceUnit (层级树中最顶层的 SpaceUnit,若自身已是顶层则返回自身)
查找层级树中最顶层的 SpaceUnit,若自身已经是顶层对象则返回自身。
返回值 SpaceUnit (层级树中最顶层的 SpaceUnit,若自身已是顶层则返回自身)
示例代码
查找具体空间单位顶层对象
lua
-- @runtime client
local world = game:GetService("World")
local unit = world:CreateUnit("TriggerUnit", { Name = "TopLevelTrigger" })
local top = unit:FindTopLevel()
if top ~= nil then
print("顶层对象:", top.Name)
end