跳转至

Simple Event

Simple Event 使用非空 StringName 作为稳定事件 ID,可以不带 payload,也可以携带少量 Variant 数据。它适合轻量状态通知,例如菜单打开、玩家跳跃或分数变化。

如果事件需要消费拦截、序列化、校验或复杂上下文,请改用 Type Event

发送事件

# 发出简单无参数的事件通知,耗时极低
Gf.send_simple_event(&"EVENT_PLAYER_JUMPED")

# 也可以携带少量 Variant payload
Gf.send_simple_event(&"EVENT_SCORE_CHANGED", { "score": 1200 })

接收事件

func ready() -> void:
    # 注册监听,并绑定到自身的回调函数
    register_simple_event(&"EVENT_PLAYER_JUMPED", GFEventListener.from_method(self, &"_on_player_jumped", 1))

func _on_player_jumped(_payload: Variant) -> void:
    print("UI 显示:成功跳跃!")

func dispose() -> void:
    unregister_simple_event(&"EVENT_PLAYER_JUMPED", GFEventListener.from_method(self, &"_on_player_jumped", 1))

命名约束

简单事件 ID 必须稳定且非空,空 StringName 会被拒绝。建议使用能表达来源和语义的事件名,例如 &"ui_opened"&"combat_hit_resolved",不要把临时通知塞进无名通道。

Simple Event 不直接接受整数 key。这是有意的契约:StringName 可以表达来源和语义,跨日志、诊断和模块边界仍可读;裸整数容易与其他协议域碰撞,也会在 enum 重排后改变含义。

项目确实需要把固定协议号映射为事件时,应在协议适配层集中规范化,并保证发送与监听复用同一个函数:

static func protocol_event_id(message_code: int) -> StringName:
    return StringName("protocol.message:%d" % message_code)


var event_id: StringName = protocol_event_id(MessageType.RES_NPC_CHAT)
Gf.listen_simple(event_id, GFEventListener.from_method(self, &"_on_receive_chatnpc", 1))
Gf.send_simple_event(event_id, payload)

协议 enum 应显式固定数值,不能依赖声明顺序。需要结构校验、来源身份、序列号或网络拒包原因时,不应继续扩张 Simple Event,而应使用 Type Event 或项目协议分发层。

普通模块应优先使用 owner 绑定监听,详见 监听器所有权与生命周期