自定义事件通知器
概述
自定义事件通知器(Custom Event Notifier) 组件是 Yahaha 中实现高级脚本交互的核心工具。将该组件挂载到任意对象后,可让其监听并响应自定义事件(custom event),从而实现超越内置无代 码逻辑的动态交互玩法。
使用自定义事件通知器可以:
- 让对象响应自定义、可脚本化的事件
- 创建比内置触发器(trigger)更灵活的交互
- 协调多个对象间的复杂行为
工作原理
- 接收方(Receiver):任何挂载了自定义事件通知器的对象都可以接收自定义事件。
- 发送方(Sender):自定义事件可通过 Lua 脚本中的
yahaha.EventSystem:NotifyObjectEvent()函数,或通过 事件触发器(Event Trigger) 组件的NotifyCustomEventNow动作(action)发送。 - 响应(Response):当收到的事件与对象配置匹配时,会执行指定动作(如播放音频、运行脚本等)。
典型使用流程
给接收对象添加通知器
- 将需要响应自定义事件的对象(如灯光、音频源等)添加到场景。
- 通过 添加组件(Add Components)> 自定义事件通知器(Custom Event Notifier),为 这些对象添加通知器,使其具备接收自定义事件的能力。
设置事件发送方
-
创建一个空对象(empty object)作为事件发送方和中央控制器。
-
通过 添加组件(Add Components)> 自定义事件通知器(Custom Event Notifier),为该对象添加通知器。
-
通过 添加组件(Add Components)> 事件触发器(Event Trigger),为该空对象添加事件触发器。
-
配置事件触发器组件:
- 触发对象(Trigger Object):发起事件的对象或交互(如可收集物品)
- 触发事件(Trigger Event):要监听的具体事件(如 OnPropInteracted)
- 动作对象(Action Object):要通知的对象(通常为该空对象本身)
- 动作函数(Action Function):NotifyCustomEventNow
这样设置后,空对象会在收到触发事件时立即向注册的监听对象发送自定义事件通知。
编写事件脚本逻辑
- 若需自定义事件分发逻辑,可为事件发送对象添加 Lua 脚本。
- 在
{ComponentName}.editor.lua中为每个目标对象定义字段。 - 在运行时
{ComponentName}.lua脚本中,使用yahaha.EventSystem:NotifyObjectEvent(targetObject, "com.yahaha.sdk.trigger.CustomEvent")向目标对象发送事件。
代码示例
local notifyObject
if notifyObject then
yahaha.EventSystem:NotifyObjectEvent(notifyObject, "com.yahaha.sdk.trigger.CustomEvent")
end
例如,以下代码在玩家执行某操作时触发雷声和黑暗效果:
if do_action == "play_thunder" and script.fields.AudioThunder then
yahaha.EventSystem:NotifyObjectEvent(script.fields.AudioThunder, "com.yahaha.sdk.trigger.CustomEvent")
end
if do_action == "turnoff_light" and script.fields.Light then
SetDark()
end
故障排查(Troubleshooting)
- 事件未触发:
- 检查接收对象是否挂载了自定义事件通知器。
- 确认脚本中的事件名与事件触发器配置一致。
- 无响应或无动作:
- 检查事件触发器设置是否正确,动作是否指向正确(如播放音频)。
- 确认脚本字段中引用的对象已正确赋值。
- 脚本报错或行为异常:
- 使用 print/debug 日志确认脚本是否正常运行。
- 检查所有对象是否在场景中处于激活状态。