こんにちわ。たてのです。最近ミラティブでクラッシュ・ロワイヤル(以降クラロワ)と連携したイベントを実施しました。このイベントをどのように実現したのかについてレポートします。
クラロワはAPIを公開しており、開発者サイトに登録すれば、ユーザ情報やバトル履歴などを取得することができます。
他にもPUBG, CoD, FortniteなどのゲームタイトルはAPIを公開しており、 これらのAPIを使ったサービスやアプリによる独自のエコシステムが構築されています。 (2019年12月現在、クラロワ以外にモバイルプレイヤーの情報が取得できるのはFortniteだけのよう)
ミラティブでは、たくさんの配信者さんがクラロワの配信をしています。そこでクラロワAPIを使って配信中のバトル結果などを利用することでユーザさんがより楽しみながら配信できるイベントを企画し、実施しました。
クラロワAPIについて
クラロワAPIからは次の情報が取得できます。
- プレイヤー情報
- バトル履歴情報
- クラン情報(クランとは複数プレイヤーが所属するチームのことです)
ミラティブはモンストで簡単にマルチをするためにID連携機能を実装しました。 それを利用して、クラロワAPIを実行するのに必要なプレイヤー情報を登録できるようにしました。
プレイヤー情報を入力してID連携すると、ミラティブのサーバはクラロワAPIから次の情報を取得し、DBに保存します。
- クラロワのプレイヤー名
- 所属クランのID
- 最高トロフィー
- キングレベル
最高トロフィーやキングレベルは、ミラティブの配信一覧でも表示され、視聴者が配信者に興味をもつきっかけとして機能しています。
取得したプレイヤー情報からクランIDが得られるので、次のクラン情報を取得しDBに保存します。
- クラン名
- 所属するプレイヤー一覧
また、配信時に定期的にバトル履歴を取得し次の情報をDBに保存します。
- 勝敗
- バトルの種類
- 変化したトロフィー数
クラロワバトルイベント
上記の情報を使って、個人戦とクラン戦の2種類のイベントを開催しました。
1. 個人戦でのバトルイベント
クラロワで通常バトルであるマルチバトルの勝利数を個人単位で計測し、ランキングを競うというものです。
2. クラン戦でのバトルイベント
Mirrativ — クラメンを誘ってNo1クランを目指そう🔥クラン対抗ランキング開催⚔️...
クラン対抗のバトルイベントでは、配信の仕組みを考慮して、クランメンバーがそのメンバーの配信でコメントすることでスコアが伸びるという仕組みを導入しました。
イベントを開始すると、多くのクラロワプレイヤーの配信者さんが参加してくれて、クランのスコアを伸ばしていきました。 そうしてランキングの上位のスコアが伸びてくると、配信者さんが活発なクランに移動したり、ミラティブをやってないプレイヤーを連れてきたりして、盛り上がっていました。
API連携時の注意点とその対策
API連携する際、次のような制約および注意点がありました。
- APIのエラー処理と、エラー発生時のリカバリ処理が必要
- 応答に時間がかかることがありうるため、同期型での処理が難しい
- APIの単位時間あたりリクエスト数が提示されている上限を超えないよう注意が必要
- クラロワ側で更新された情報の同期処理
- クラロワAPIには認証機能はない
クラロワAPIにはプレイヤーの認証機構がありません。そのため、ミラティブユーザがクラロワプレイヤーを切り替えて配信したり、複数のミラティブユーザが特定のクラロワプレイヤーで配信するといったことが起こりえます(ミラティブユーザとクラロワプレイヤーはN:M)。またクラロワプレイヤーはクランを移動することがあります。それらを踏まえて、スコア計算のため次のルールの設定をしました。
- クラロワプレイヤーはいずれか1つのクランに所属する。プレイヤーのスコアはそれが所属する1つのクランのスコアとなる。クランを移動した場合、プレイヤーのスコアは移動先のクランに引き継がれる。
- ミラティブユーザはクラロワプレイヤーを切り替えることができる。切り替えるとスコアは引き継がれない。切り戻せばスコアは復元される。
上記を踏まえ次のような設計および実装にしました。
- MirrativアプリからのAPI処理、Web画面表示処理などはWebサーバにて処理
- Webサーバは、必要に応じてクラロワのプレイヤー, バトル履歴, クランの情報の取得要求をDaemonサーバに通知
- Daemonサーバでクラロワ情報取得要求を処理
- DaemonサーバはProxyを経由してクラロワAPIにアクセス
- DaemonサーバはクラロワAPIから取得した情報をDBに保存、定期的にクランのスコアを算出
- WebサーバはDBに保存された値を適宜取得し、Mirrativアプリに返す
Webサーバはクラロワ情報取得は実行せず、Daemonサーバに取得要求を通知して処理を終了します。Daemonサーバは通知を受けてクラロワ情報を適宜取得し、DBに保存します。上記構成にて同期処理・非同期処理を行うようにしました。
次にデータ構造についてです。
- userはミラティブユーザのマスタ、user_clashroyale_playerはクラロワプレイヤー情報を保持、clanはクラン情報を保持
- clashroyale_battle_event がイベントマスタ、user_clashroyale_battle_event_summaryがイベントのユーザ単位のスコアを保持、clashroyale_clan_event_summaryがイベントのクラン単位のスコアを保持
- user_clashroyale_player にて user_id, player_id の複合キーとすることで、プレイヤーIDの変更に対応
- プレイヤーがクラン移動したことを検出したら、プレイヤー、クランをそれぞれ更新する。
- クランに所属するプレイヤーはまるっとclanテーブルに保持。
プレイヤー毎、クラン毎にDBに値を保持しておいて、差分を検出したら情報を取得するよう実装しました。 その際、プレイヤー毎、クラン毎にDaemonサーバが同じ情報単位に対しては一定時間内に一定数以上の同期処理が走らないよう工夫しました。
結果として次の内容を実現しました。
- クラロワAPIに安定してアクセスできる
- リクエスト数に応じて単位時間あたりリクエスト数を調整することでクラロワAPIへのリクエスト数上限への対応が可能
- プレイヤー情報、クラン情報が一定時間内に同期できている状態を維持
- ユーザがプレイヤーを変更したり、複数のユーザが同じプレイヤーを登録したときに有効データを選別してスコアを算出
ゲーム開発者の皆様へ
イベント期間中はクラロワ配信数が通常時にくらべて倍増するなど、たくさんのユーザさんが楽しめるイベントとなりました。 イベントを通してユーザさん同士が繋がることで、ゲームをより深く長く楽しんでもらえるようになったのではと思っています。 次回以降のイベントでは、クラロワのDeeplinkも連携して、イベント詳細の画面でクランを選択すると、クラロワのクラン詳細の画面が表示される、クラン移動を簡単にする、といった機能も盛り込んでいく予定です。そのほか、引き続きイベントの内容を工夫したり、他のタイトルでも同様の取り組みが実施できるよう事業開発サイドと一緒に試行錯誤をしています。
というわけで、うちのタイトルだとAPIやDeeplinkあるからこういう連携してもらえればユーザさんも楽しめるし、配信も盛り上がるよ!みたいなトピックあれば、ぜひご連絡ください!お待ちしております!
We are hiring !
ミラティブでは、ゲームとも連携しながらユーザさんが楽しめるイベントや仕組みづくりを構築するエンジニアを募集中です。 ゲームとこんな風に連携すればもっと楽しめるのに!といったアイディアやパッションをお持ちの方、ご連絡ください!