主题
EventService
EventService 事件系统服务,提供事件的注册、注销与触发能力,用于编辑器插件之间的消息通信和编辑器事件监听。
概览
EventService 是事件系统服务,围绕事件名提供统一的注册、注销与触发能力。它支持持久监听与一次性监听两种注册方式,并返回监听标识用于后续精确注销,同时可以按事件名查询是否存在监听者以及监听数量。借助这些能力,各模块或插件之间无需直接持有对方引用即可完成消息通信与事件响应。
Get by:
lua
-- @runtime editor
local service = editor:GetService("EventService")函数
On
注册事件回调:为指定事件名绑定一个回调函数,并返回该注册的 Int 类型注册 ID。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
callback | Function | 事件回调函数 |
返回值
| 类型 | 说明 |
|---|---|
Int | 注册ID(用于取消注册) |
注册并移除自己的事件监听
lua
-- @runtime editor
local events = editor:GetService("EventService")
local eventName = "se_doc_example_event"
local listenerId = events:On(eventName, function(payload)
print("事件数据:", payload)
end)
events:Fire(eventName, { value = 1 })
events:Off(eventName, listenerId)Once
为指定事件注册单次监听;首次触发后自动注销,返回监听 ID。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
callback | Function | 事件回调函数(触发一次后自动注销) |
返回值
| 类型 | 说明 |
|---|---|
Int | 注册ID |
注册并触发一次性监听
lua
-- @runtime editor
local events = editor:GetService("EventService")
local eventName = "se_doc_once_event"
events:Once(eventName, function(payload)
print("首次触发:", payload)
end)
events:Fire(eventName, { value = 1 })Off
取消事件回调:根据事件名与注册时得到的注册 ID,移除该事件上对应的回调监听。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
listenerId | Int | 注册时返回的监听 ID |
通过注册 ID 移除监听
lua
-- @runtime editor
local events = editor:GetService("EventService")
local eventName = "se_doc_off_event"
local listenerId = events:On(eventName, function() end)
events:Off(eventName, listenerId)OffAll
取消指定事件上注册的全部回调监听。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
清理文档示例事件的全部监听
lua
-- @runtime editor
local events = editor:GetService("EventService")
local eventName = "se_doc_off_all_event"
events:On(eventName, function() end)
events:OffAll(eventName)Fire
触发名为 eventName 的事件,并将可选的 args 参数传递给该事件上注册的回调函数。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
args | Any | 传递给回调的可变参数 |
向同名事件的监听者传递数据
lua
-- @runtime editor
local events = editor:GetService("EventService")
local eventName = "se_doc_fire_event"
local listenerId = events:On(eventName, function(payload)
print("收到数据:", payload)
end)
events:Fire(eventName, { value = 1 })
events:Off(eventName, listenerId)HasListeners
检查当前事件服务中是否存在使用指定事件名注册的监听者。传入的事件名对应一个已被监听的事件时返回 true,否则返回 false。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
返回值
| 类型 | 说明 |
|---|---|
Bool | 是否存在监听 |
调用 HasListeners
lua
-- @runtime editor
local eventService = editor:GetService("EventService")
local eventName = "default" -- String
local result = eventService:HasListeners(eventName) -- 返回 Bool
if result then
print("调用结果为 true")
else
print("调用结果为 false")
endGetListenerCount
查询事件服务中指定名称事件当前的监听者数量。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | String | 事件名称 |
返回值
| 类型 | 说明 |
|---|---|
Int | 当前监听数量 |
调用 GetListenerCount
lua
-- @runtime editor
local eventService = editor:GetService("EventService")
local eventName = "default" -- String
local result = eventService:GetListenerCount(eventName) -- 返回 Int
if result ~= nil then
print(result)
if result ~= 0 then
print("结果非零")
end
end