Saltar al contenido principal

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)
  1. Emisor. El atajo del jugador local dispara PlayerEmotes.Played (el mismo evento que escucha el código local). OnlineEmoteRelay se 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.
  2. Servidor. La partida del mundo reenvía el opcode 3 a los demás jugadores tal como llega, igual que los eventos de cambio de mapa (2) y de seguidor (4). No interpreta el cuerpo.
  3. Receptor. WorldSyncService lee el mensaje de forma estricta, dispara OnPlayerEmote(userId, balloonName) y PlayerSpawnManager dibuja 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​

Opcode3 (WorldSyncService.OP_EMOTE)
Cuerpo{"e":"heart"}: un objeto JSON con el nombre del globo en e
Constrúyelo conOnlineEmotes.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.IsValidName comprueba el nombre antes de que nada lo use: letras minúsculas, dígitos y guiones bajos, con un máximo de OnlineEmotes.MaxNameLength (32) caracteres. OnlineEmotes.TryRead(json, out name) devuelve false para cualquier otra cosa (JSON mal formado, un nombre vacío, uno largo), y WorldSyncService registra Bad 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​

MiembroCuándo
WorldSyncService.OnPlayerEmoteLlegó un emote válido: (userId, balloonName)
OnlineEmotes.ShownSe 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​

TipoNamespaceFunción
OnlineEmotesOpenMon.MCE.Online.WorldFormato del mensaje, validación del nombre, ShowOver(Transform avatar, string name, EmotionBalloonSet game), el evento Shown
OnlineEmoteRelayOpenMon.MCE.Online.WorldLleva PlayerEmotes.Played al socket
WorldSyncServiceOpenMon.MCE.Online.WorldOP_EMOTE, OnPlayerEmote
PlayerSpawnManagerOpenMon.MCE.Online.WorldDibuja el globo sobre el avatar remoto