btn_arrowcmn-facebookcmn-tiktokcmn-twittercmn-xcmn-youtubecorroborationengineerEngineerhamburgericon-angleicon-arrow-bottom-lineicon-arrow-diagonal-01icon-arrow-diagonal-02icon-arrow-next-01icon-arrow-next-02icon-arrow-strokeicon-arrowicon-close-btnicon-externalicon-facebookicon-fukidashi-01icon-fukidashi-02icon-fukidashi-03icon-fukidashi-04icon-fukidashi-05icon-fukidashi-06icon-fukidashi-07icon-fukidashi-08icon-fukidashi-09icon-fukidashi-10icon-fukidashi-11icon-fukidashi-12icon-fukidashi-13icon-fukidashi-14icon-fukidashi-15icon-fukidashi-16icon-fukidashi-17icon-fukidashi-18icon-fukidashi-19icon-hatebuicon-instagramicon-is-index-illust-01icon-is-index-illust-02icon-is-index-illust-03icon-lineicon-linked_inicon-pinteresticon-rank-dash-offseticon-rank-frameicon-rank-no-frameicon-rank-trophy-item-01icon-rank-trophy-item-02icon-rank-trophy-staricon-triangle-01icon-triangle-02icon-twittericon-xicon-youtubeis-bg-book-01is-bg-book-02is-bg-book-03is-bg-book-04is-bg-book-05is-bg-book-06is-bg-boxis-bg-cupis-bg-desktopis-bg-flagis-bg-glassis-bg-hatenais-bg-human-01is-bg-human-02is-bg-human-03is-bg-human-04is-bg-pcis-bg-plusis-bg-smartphoneis-feature-01-lineis-font-daiis-font-gokuis-font-jiis-font-senis-footer-illust-01is-footer-illust-02is-nav-arrowis-prologue-boxlicense-foreignlicenselogo-gree

TECH BLOG

【TECH BLOG #14】新規開発でレイド実装しました

こんにちは、エンジニアのかわバターです。
ファンプレックスでは、日々ゲームの運営を行っています。
私の担当しているプロジェクトでは運営の中で、年に数回大規模な改修や新規実装を行っております。
直近「レイド」の新規実装を行ったので書いてみました。
普段ブログを書くこともないので温かい目で見てもらえると助かります。

はじめに

はじめに、私の担当しているタイトルの説明をさせていただきます。
iOS、Androidでリリースしているネイティブアプリで、デッキを設定しバトルを行ったり、ユニット育成を行ったりするゲームになります。
月1回アップデートを行っており、3ヶ月に1回ほどのペースで大型アップデートを行っています。
今までプレイヤー同士で協力して遊ぶ要素がなかったため、今回の大型アップデートでレイド機能の開発を行いました。

レイド開発にあたり当初はもりもりな仕様で、限られた時間の中ユーザーへ最大限面白いものを届けるために、仕様検討や調整を繰り返した結果、一番ネックだったwebsocket周りの実装を外部のAPIをうまく利用することで、可能な限り要望にあった実装が行えました。

実装内容(一部)

今回バトル周りの一部を紹介させて頂きます。

上記画像のようにクライアントからAPIを叩き、サーバー内で処理を行いwebsocketから、同じレイドに参加しているユーザーへメッセージを送信して処理を行っています。

・レイドバトル開始時にルームへwebsocketを使用して接続
・バトル開始時にアイテム使用効果をwebsocketへ送信 > クライアントでアイテムが使用されたことを検知し同期
・バトル終了時ボスへ与えたダメージ反映 > websocketへ送信 > クライアントでボスHPを同期

スタンプ機能

スタンプ機能は用意された画像を選択すると、同じレイドバトルに参加しているユーザーに送信され画面上に表示されます。
スタンプには「ありがとう」「よろしく」などいくつか用意しました。

・クライアントからwebsocketに送信したスタンプを参加ユーザーへ情報を送信
・受信した情報をもとにクライアントでスタンプを表示

websocketから送信する文字列

[
    'user_id' => ユーザーID,
    'name' => ユーザー名,
    'message_type' => タイプ 1:スタンプ 2:アイテム 3:ダメージ,
    'value' => 数値
]

一例ですがjson型をクライアントが受信し、message_typeによって処理を振り分けました。

例) message_type:3、value:1000の場合ではレイドBOSSのHPを1000減らし同期

valueの値は用途によってスタンプIDやダメージ値などが入ります。

工夫した点

初期の仕様は完全同期のレイド仕様でしたが、工数が少なくサーバーのトラフィックや、同時接続の問題がある中、如何にリアルタイム制を感じられるような仕様にするかが問題でした。

そこで工夫した点は、バトル開始時にアイテムを使用した際、バトル中ユーザーへも効果が反映されたり、バトル終了時にボスへ与えたダメージをバトル中ユーザーにも反映されるような仕組みになります。リアルタイム感を与えるために肝となるのはバトル中のユーザーへ、いかに別ユーザーの動きを反映できるかというところでした。

発生した問題点

レイドに参加してもらうために救援機能がありまして、救援機能は、救援を受けたユーザーが参加できますが、リリース当初は救援を受信する数が少なく、大人数でバトルすることが少なくなっていました。原因としてはユーザーのデータを複数のデータベースに分散して負荷対策を行っているのですが、その影響で救援を送信する対象に偏りが出る場合があり、全体にまんべんなく救援が送信できていませんでした(他にもいくつか要因はあり)。
解消にあたっては、救援送信、参加率などのログを取りそれを元に原因となる箇所を割り出し救援ロジックの改修を行いました。
今では上限人数まで参加してバトルする事が増えよりリアルタイム感が出るようになりました。

最後に

今回実装したレイド機能も1度作ったら終わりではなくオミットしてしまった機能など日々改善を続けています。
大型のアップデートや改修は簡単には行かないことが多いですがその分ユーザーからの反応が返ってくるとやりがいがあるなと思います!

ファンプレックスでは運営する中で、新規実装を行うチャンスがあります。
新しいことに挑戦したいエンジニアも絶賛募集中ですので、興味がある方はぜひご応募いただけると嬉しいです。

※2021年7月1日よりファンプレックスはグリーエンターテインメントへ商号変更いたしました。
※2021年6月30日以前の記事においてファンプレックスという表記がある場合がございますが、ご了承ください。

information

グリーエンターテインメント株式会社 広報担当

東京都港区六本木6-10-1 六本木ヒルズ森タワー

E-mail:info-ent@ml.gree.net