主题
World
概览
| 字段 | 值 |
|---|---|
| Kind | Service · 服务 Service |
| Realm | common |
继承关系
- Unit(4 属性 / 25 函数 / 6 事件)
继承成员
3 个来源 / 6 属性 / 35 函数 / 6 事件
- 来自 ModelUnit(4 属性 / 1 函数)
- 函数:
MoveTo
- 函数:
- 来自 SpaceUnit(2 属性 / 9 函数)
- 来自 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
- 属性:
World 是三维世界的根容器,负责承载并激活所有挂载在其下的单位对象,只有在 World 树内的单位才会被渲染并参与物理交互。它提供 CreateUnit 按类型动态创建单位、CreateAsset 依据资产标识批量生成单位,以及 GetServerTime 获取统一服务器时间和 GetCustomEventSignal 订阅命名自定义事件的能力。此外,通过 AOIType2 相关半径与销毁类型属性可以控制兴趣区域的流式加载范围,CurrentCamera 则直接暴露当前使用的相机单位。
适用场景
在客户端或服务端需要创建并挂载场景单位、加载预设资源、读取服务器时间或获取自定义事件信号时,通过 game:GetService("World") 获取世界根容器。
使用要点
先获取 local world = game:GetService("World"),再调用 world:CreateUnit(unitType, values)。World:CreateUnit 与全局 game:CreateUnit 的 Parent 规则不同,不要混写 receiver。
注意事项
World:CreateUnit 在 values 省略 Parent 时会把新单位默认挂载到当前 World;若需要挂到其他容器,应显式传入 Parent。全局 game:CreateUnit 不会自动设置 Parent,使用时通常需显式指定。单位从 World 树移除后会停止渲染和物理模拟,重新挂载后可恢复。
代码示例
创建临时单位并读取服务器时间
lua
-- @runtime client
local world = game:GetService('World')
local unit = world:CreateUnit('WorldUnit', {
Name = 'TemporaryWorldUnit',
Position = Vector3.New(0, 5, 0),
})
if unit ~= nil then print('单位创建成功:', unit.Name) end
print('当前服务器时间:', world:GetServerTime())
if unit ~= nil then unit:Destroy() end属性 (5)
| Name | 类型 | 默认值 | 说明 |
|---|---|---|---|
AOIType2StreamingMainRadius | Float | 64 | World 服务上的 Streaming 主半径配置属性,类型为 Float,标题为“Streaming主半径”。该属性可读可写,用于设置世界中 Streaming 主半径的浮点数值。 |
AOIType2MinRadius | Float | 100 | World 服务上的 AOI 第二类型最小半径(内圈)配置属性,类型为 Float,标题为“AOI内圈”。该属性可读可写,表示 AOI 内圈对应的半径数值。 |
AOIType2MaxRadius | Float | 200 | World 服务上的 AOI 第二类型最大半径(外圈)配置属性,类型为 Float,标题为“AOI外圈”。该属性可读可写,表示 AOI 外圈对应的半径数值。 |
AOIDestroyType | Int | 0 (Immediately) | AOI 销毁类型,Meta 公开类型为 Int,并定义了对应的内联取值名称。 |
CurrentCamera | CameraUnit | - | World 的 CurrentCamera 属性指向当前世界正在使用的相机实例,类型为 CameraUnit。通过该属性,脚本可以拿到场景当前的相机对象,并进一步访问或调整该相机实例上已公开的成员。 |
关联类型
函数 (4)
CreateUnit
签名:CreateUnit(unitType: String, values?: Table) -> Unit (新创建的单位实例)
按单位类型名在 World 中创建一个基础单位实例,并可通过可选参数表传入初始属性。
| 参数 | 类型 | 说明 |
|---|---|---|
unitType | String | 要创建的单位类型名称,如 "WorldUnit"、"ModelUnit"、"EffectUnit" 等 |
values? | Table | 初始化属性键值表。省略 Parent 时默认挂载到当前 World;若需挂到其他容器,应显式传入 Parent。可填写字段以目标 unitType 及其继承链的公开属性为准。 |
返回值 Unit (新创建的单位实例)
示例代码
创建并清理临时世界单位
lua
-- @runtime client
local world = game:GetService('World')
local unit = world:CreateUnit('WorldUnit', { Name = 'TemporaryUnit' })
if unit ~= nil then
print('已创建:', unit.Name)
unit:Destroy()
endCreateAsset
签名:CreateAsset(assetId: String) -> Array<Unit> (Units)
根据资产 ID 加载资产,并返回该资产所包含的单位实例数组。
| 参数 | 类型 | 说明 |
|---|---|---|
assetId | String | 资产预设ID |
返回值 Array<Unit> (Units)
示例代码
加载预设并清理本次创建的单位
lua
-- @runtime client
local world = game:GetService('World')
local function loadAndInspectAsset(assetId)
if assetId == nil or assetId == '' then return end
local units = world:CreateAsset(assetId)
print('加载单位数量:', units and #units or 0)
for _, unit in ipairs(units or {}) do
unit:Destroy()
end
end
-- 调用方把项目配置中的真实预设资源 ID 传给 loadAndInspectAssetGetServerTime
签名:GetServerTime() -> Float (服务器时间,单位为秒)
获取当前服务器时间,单位为秒。
返回值 Float (服务器时间,单位为秒)
示例代码
获取服务器时间并输出
lua
-- @runtime client
-- 获取 World 服务实例
local world = game:GetService("World")
-- 获取当前服务器时间(秒)
local serverTime = world:GetServerTime()
-- 输出服务器时间
print("当前服务器时间:", serverTime, "秒")GetCustomEventSignal
签名:GetCustomEventSignal(eventName: String) -> Signal (自定义事件信号)
获取一个全局自定义事件的信号对象,用于监听或触发跨脚本通信。
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 自定义事件名 |
返回值 Signal (自定义事件信号)
示例代码
获取自定义事件信号并监听(判空保护)
lua
-- @runtime client
local world = game:GetService('World')
local signal = world:GetCustomEventSignal('MyCustomEvent')
if signal == nil then
print('自定义事件不存在,请先确认事件名已注册')
return
end
signal:Connect(function(data)
print('收到自定义事件,数据:', tostring(data))
end)
print('已开始监听 MyCustomEvent 事件')