メインコンテンツまでスキップ

オンラインエモート

MCE Online では、プレイヤーが表示した感情バルーンは他のプレイヤーにも見えます。F3 を押すと、あなたが範囲内にいるすべての画面で、あなたのアバターの上にハートが現れます。

エモートは位置更新と同じリアルタイムマッチ上を流れます(ワールド同期 を参照)。追加のサービスも RPC もデータベースも不要です。エモートは中継されて忘れられる、ごく小さなメッセージです。

Pro および Source ティアで利用できます。

フロー​

 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. 送信側。 ローカルプレイヤーのホットキーが PlayerEmotes.Played(ローカルのコードが購読するのと同じイベント)を発生させます。OnlineEmoteRelay は、ワールド同期サービスの実行中にこのイベントへ接続され、サービスが実行中で、接続済みで、かつワールドマッチに参加している間だけ、バルーンの名前をワールドマッチへ送ります。二重に接続しても二重には送信されません。
  2. サーバー。 ワールドマッチは、マップ変更(2)やフォロワー(4)のイベントと同様に、opcode 3 を届いたまま他のプレイヤーへ転送します。本文は解釈しません。
  3. 受信側。 WorldSyncService がメッセージを厳密に読み取り、OnPlayerEmote(userId, balloonName) を発生させ、PlayerSpawnManager がそのプレイヤーのアバターの上にバルーンを描画します。ただしアバターがスポーンしている場合に限られるため、あなたの関心領域内のプレイヤーだけがそれを見ます。

メッセージ​

Opcode3(WorldSyncService.OP_EMOTE)
本文{"e":"heart"} — e にバルーン名を持つ JSON オブジェクト
作成方法OnlineEmotes.Payload(name)

安全性:ピアはあなたに何も描かせられない​

ピアが送るのは外部からのテキストなので、決して信頼されません。

  • 名前は、何かが使う前に OnlineEmotes.IsValidName で検査されます。使えるのは小文字、数字、アンダースコアで、長さは最大 OnlineEmotes.MaxNameLength(32)文字です。OnlineEmotes.TryRead(json, out name) は、それ以外のもの(不正な JSON、空の名前、長すぎる名前)に対して false を返し、WorldSyncService は Bad emote from <user>: not a balloon name. をログに出して破棄します。
  • 描画されるのは常に、あなたのゲームまたはエンジンがすでに所有している、その名前のバルーン(EmotionBalloonSet.Resolve)です。メッセージが運ぶのは名前であり、スプライトではありません。誰も持っていない名前は何も描画しません。

これは、バルーンにコンテンツ同期が不要な理由でもあります。ゲームが heart を独自の絵に置き換えていれば、あなたのゲームのすべてのプレイヤーにはあなたのハートが見えます。

エモートを観測する​

メンバータイミング
WorldSyncService.OnPlayerEmote有効なエモートが届いた:(userId, balloonName)
OnlineEmotes.Shownリモートアバターの上にバルーンが描画され、配置済み:(balloonName, avatarTransform)。例外を投げるリスナーはログに記録され、バルーンは止まりません。
using OpenMon.MCE.Online.World;

OnlineEmotes.Shown += (name, avatar) =>
Debug.Log($"{avatar.name} shows '{name}'.");

リファレンス​

型名前空間役割
OnlineEmotesOpenMon.MCE.Online.Worldメッセージ形式、名前の検証、ShowOver(Transform avatar, string name, EmotionBalloonSet game)、Shown イベント
OnlineEmoteRelayOpenMon.MCE.Online.WorldPlayerEmotes.Played をソケットへ運ぶ
WorldSyncServiceOpenMon.MCE.Online.WorldOP_EMOTE、OnPlayerEmote
PlayerSpawnManagerOpenMon.MCE.Online.Worldリモートアバターの上にバルーンを描画