概要
RPGアツマールには非同期ネットゲームを想定したAPIが存在します
その中の「グローバルシグナル」を使ってみた記事です
以前、ユーザーシグナルについての記事を書いているので
基本的な解説は重複しているところがあります
- [RPGアツマールのユーザーシグナルでいいね!を送る][link1]
[link1]:https://qiita.com/shirogane/items/3d8955a69a554e9ff2f8
作ったもの
- レイドバトル(エンディング後の要素にしています)
- https://game.nicovideo.jp/atsumaru/games/gm9445
- ボスに与えたダメージをグローバルシグナルで送りあってレイドバトルを実現しています
作ったものの具体的な説明については別な記事で書こうと思います
シグナルとは
- 公式のドキュメントはこちらです
ユーザー間での情報のやり取りを、シグナルという機能によって行えます
シグナルには100byte以内の情報(文字列)を入れることができます
例えば、送り側で以下のようなjsonの文字列を作って送信します
{ SignalId:1, SaveIdx:1, Hp:10000 }
受け側ではシグナルを取得すると送られた上記の文字列を取得できます
jsonを解釈することで、送り側から送られたSignalIdとSaveIdxとHpの値が分かるという流れです
送り側のユーザーIDや名前はこれとは別に付与されているので含めなくて大丈夫です
シグナルには「ユーザーシグナル」と「グローバルシグナル」があります
ユーザーシグナル
指定したユーザー間で情報をやり取りするときはユーザーシグナルを使います
送り先のユーザーIDを引数に指定して目的のユーザーに送信します
使い方のイメージは以下の記事にまとめています
- [RPGアツマールのユーザーシグナルでいいね!を送る][link1]
グローバルシグナル
全ユーザーに対して情報を送るときにはグローバルシグナルを使います
ユーザーシグナルとの違いは
- 全ユーザーに対して送信する
- 自分発信のシグナルを受信する
という辺りです
グローバルシグナルの動き
本記事ではグローバルシグナルを解説します
全ユーザーに対して送る「グローバルシグナル」の動きを解説します
送り側は
window.RPGAtsumaru.experimental.sendSignalToGlobal()
を実行します
1回送ると全ユーザーが取得できるようになります
送り側とたくさんの受け側(自分も含む)がいて
1件送るとこうなって・・・
また1件送るとこうなって・・・
サーバーに蓄積されていくイメージです
受け側は
window.RPGAtsumaru.experimental.getGlobalSignals()
を実行します
各ユーザーごとに、
1回の実行で先程送られた2件を全部取得します
またこの後に、送り側から3件目、4件目を送信してから、
受け側でシグナルの取得を行うと、受け側では1~4件目を全部取得してしまいます
APIの実行では全部取得してしまうので、
ゲーム側で新しいシグナルだけを読みたい場合は、
どこまで取得したかの情報をクライアントで持っておく必要があります
公式プラグインの AtsumaruGlobalSignalExperimental.js
が、
この辺りの制御をうまくやっていて、全シグナルを取りつつ、
ゲーム側には新しいシグナルしか渡さないようになっています
シグナルの情報が移動するイメージはユーザーシグナルとほぼ同じですが、
送る時はユーザーIDを指定せずに全員が取得できるように送ります
全員が取得できるということは自分も取得できてしまいます
公式プラグインを読み解く
- [RPGアツマールのユーザーシグナルでいいね!を送る][link1]
ユーザーシグナルのものとほぼ同じです
上記の解説記事をご参照ください
すべてのシグナルを取得できない可能性がある
こちらはユーザーシグナルもグローバルシグナルも同じですが
以下のことに注意してゲームの仕様を決める必要があります
- 一定の件数/容量を超えると古いものから削除される仕様のためシグナルは全て受け取れない可能性がある
- 件数や容量の詳細は公式の制限詳細を参照してください
特にグローバルシグナルの場合全ユーザーのシグナルが来るので
古いものが欠落する可能性が高くなると思います
自分発信のシグナルを受け取る
グローバルシグナルはユーザーシグナルと違って全員が取得できるシグナルのため、自分が発信したシグナルを自分が受け取ることになります
例えば「誰かがログインしました」的な通知はグローバルシグナルで実現できると思いますが、自分のログイン通知をゲーム画面に出さなくてもよい仕様なのであれば、自分発信のシグナルを受け取ったときに除外するようにします
シグナルには発信者のユーザーIDが付与されているので、それが自分のユーザーIDと一致したら処理しない、とすればよいです
まとめ
グローバルシグナルの仕組みの説明と、使うときの注意点をまとめてみました
公式プラグインを使うだけであってもどういう動き方をしているのかが分かれば使い方のイメージがしやすいかなと思います