Emotes en línea
Con MCE Online, los globos de emoción que muestra un jugador también los ven los demás: pulsa F3 y aparece un corazón sobre tu avatar en cada pantalla que te tenga a su alcance.
Los emotes viajan por la misma partida en tiempo real que las actualizaciones de posición (ver Sincronización del mundo). No necesitan ningún servicio extra, ni RPC, ni base de datos: un emote es un mensaje diminuto que se retransmite y se olvida.
Disponible en los niveles Pro y Source.
El flujo
sender Nakama world match receiver
────── ────────────────── ────────
F3 pressed
PlayerEmotes.Played("heart")
OnlineEmoteRelay ──opcode 3──▶ relays it as it comes ──opcode 3──▶ WorldSyncService.HandleEmote
{"e":"heart"} (no inspection) OnlineEmotes.TryRead (checks the name)
OnPlayerEmote(userId, "heart")
PlayerSpawnManager.ApplyEmote
OnlineEmotes.ShowOver(avatar, "heart", gameSet)
- Emisor. El atajo del jugador local dispara
PlayerEmotes.Played(el mismo evento que escucha el código local).OnlineEmoteRelayse engancha a ese evento mientras corre el servicio de sincronización del mundo y envía el nombre del globo a la partida del mundo solo mientras el servicio está en marcha, conectado y con una partida de mundo unida. Engancharlo dos veces no envía dos veces. - Servidor. La partida del mundo reenvía el opcode
3a los demás jugadores tal como llega, igual que los eventos de cambio de mapa (2) y de seguidor (4). No interpreta el cuerpo. - Receptor.
WorldSyncServicelee el mensaje de forma estricta, disparaOnPlayerEmote(userId, balloonName)yPlayerSpawnManagerdibuja el globo sobre el avatar de ese jugador, si el avatar está generado, es decir, solo lo ven los jugadores dentro de tu área de interés.
El mensaje
| Opcode | 3 (WorldSyncService.OP_EMOTE) |
| Cuerpo | {"e":"heart"}: un objeto JSON con el nombre del globo en e |
| Constrúyelo con | OnlineEmotes.Payload(name) |
Seguridad: un par no puede hacerte dibujar nada
Lo que envía un par es texto externo, así que nunca es de fiar:
OnlineEmotes.IsValidNamecomprueba el nombre antes de que nada lo use: letras minúsculas, dígitos y guiones bajos, con un máximo deOnlineEmotes.MaxNameLength(32) caracteres.OnlineEmotes.TryRead(json, out name)devuelvefalsepara cualquier otra cosa (JSON mal formado, un nombre vacío, uno largo), yWorldSyncServiceregistraBad emote from <user>: not a balloon name.y lo descarta.- Lo que se dibuja es siempre el globo de ese nombre que tu juego o el motor ya tiene (
EmotionBalloonSet.Resolve). El mensaje lleva un nombre, nunca un sprite. Un nombre que nadie tiene no dibuja nada.
Por eso mismo los globos no necesitan sincronización de contenido: si tu juego reemplaza heart por su propio dibujo, todos los jugadores de tu juego ven tu corazón.
Observar los emotes
| Miembro | Cuándo |
|---|---|
WorldSyncService.OnPlayerEmote | Llegó un emote válido: (userId, balloonName) |
OnlineEmotes.Shown | Se dibujó un globo sobre un avatar remoto, ya en su sitio: (balloonName, avatarTransform). Si un oyente lanza una excepción, se registra y no detiene el globo. |
using OpenMon.MCE.Online.World;
OnlineEmotes.Shown += (name, avatar) =>
Debug.Log($"{avatar.name} shows '{name}'.");
Referencia
| Tipo | Namespace | Función |
|---|---|---|
OnlineEmotes | OpenMon.MCE.Online.World | Formato del mensaje, validación del nombre, ShowOver(Transform avatar, string name, EmotionBalloonSet game), el evento Shown |
OnlineEmoteRelay | OpenMon.MCE.Online.World | Lleva PlayerEmotes.Played al socket |
WorldSyncService | OpenMon.MCE.Online.World | OP_EMOTE, OnPlayerEmote |
PlayerSpawnManager | OpenMon.MCE.Online.World | Dibuja el globo sobre el avatar remoto |