EventService 是 ChannelClient 的单例实现,它在所有 Unity 实例上运行。它连接到“events”通道,并允许 Unity 实例将 JSON 消息发送到外部进程中的其他 EventService 或其他 Unity 实例。
EventService 可以发送即发即弃消息(参见 EventService.Emit),或从单个客户端请求信息(参见 EventService.Request)。
using UnityEditor; using UnityEngine; using UnityEditor.MPE; using System;
public static class EventServiceDocExample { static Action s_CustomLogEventDisconnect; static Action s_PingPongEventDisconnect;
[MenuItem("EventServiceDoc/Step 0")] static void StartChannelService() { if (!ChannelService.IsRunning()) { ChannelService.Start(); } Debug.Log($"[Step 0] ChannelService Running: {ChannelService.GetAddress()}:{ChannelService.GetPort()}"); }
[MenuItem("EventServiceDoc/Step 1")] static void SetupEventServiceHandlers() { Debug.Log("[Step 1] Setup handlers"); s_CustomLogEventDisconnect = EventService.RegisterEventHandler("custom_log", (eventType, args) => { Debug.Log($"Log a {eventType} {args[0]}"); });
s_PingPongEventDisconnect = EventService.RegisterEventHandler("pingpong", (eventType, args) => { Debug.Log($"Receive a {eventType} {args[0]}"); return "pong!"; }); }
[MenuItem("EventServiceDoc/Step 2")] static void EmitMessage() { Debug.Log("[Step 2] Emitting a custom log"); EventService.Emit("custom_log", "Hello world!", -1, EventDataSerialization.JsonUtility); }
[MenuItem("EventServiceDoc/Step 3")] static void SendRequest() { Debug.Log("[Step 3] Sending a request"); EventService.Request("pingpong", (err, data) => { Debug.Log($"Request fulfilled: {data[0]}"); }, "ping", -1, EventDataSerialization.JsonUtility); }
[MenuItem("EventServiceDoc/Step 4")] static void CloseHandlers() { Debug.Log("[Step 4] Closing all Event handlers"); s_CustomLogEventDisconnect(); s_PingPongEventDisconnect(); } }
/*
When you execute the five menu items one after the other, Unity prints the following messages to the Console window:
[Step 0] ChannelService Running: 127.0.0.1:65000
[Step 1] Setup handlers
[Step 2] Emitting a custom log
Log a custom_log Hello world!
[Step 3] Sending a request
Receive a pingpong ping
Request fulfilled: pong!
[Step 4] Closing all Event handlers
*/
isConnected | 连接到 ChannelService 的“events”通道的 EventService。 |
CancelRequest | 检查是否存在特定事件的挂起请求,如果存在,则取消它。有关 Request 的更多详细信息,请参见 EventService.Request。 |
Clear | 清除所有挂起的请求。 |
关闭 | 关闭 EventService,终止与 ChannelService 的连接,并确保不再处理任何处理程序。 |
Emit | 向连接到“events”路由的所有 ChannelClient 发送即发即弃消息。 |
IsRequestPending | 检查特定事件上是否存在挂起的请求。有关 Request 的更多信息,请参见 EventService.Request。 |
Log | 向 ChannelService 发送日志消息。日志消息将打印到控制台窗口。 |
RegisterEventHandler | 为特定事件类型注册处理程序。每当发送指定类型的消息时,都会调用处理程序。消息是使用 EventService.Emit 或 EventService.Request 发送的。 |
Request | 向“events”通道上的所有连接的客户端发送请求。 |
Start | 启动 EventService 以便其侦听新消息。 |
Tick | 触发 EventService。这将处理所有传入和传出的消息。默认情况下,EventService 在每个 EditorApplication.update 上都被触发。 |
UnregisterEventHandler | 从特定事件注销处理程序。 |