entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

「アークナイツバトルイラストコンテスト」開発作戦

アドプラットフォーム部でエンジニアをやっているmyonsawaです。好きなオペレーターはエクシア、イフリータ、アズリウスです。

弊部署では普段Kubernetesを中心とした広告配信システムの運用保守や収益性改善のためのデータ分析、収益情報の自動集計などといった“裏方”的な作業が中心です。しかし今回のアークナイツのイラストコンテスト(以下「イラコン」)ではユーザーに最も近い部分を開発するという希有な機会に恵まれました。

今回はアークナイツイラコンで採用された「レイドバトル形式(レイド形式)」というイラストコンテスト形態の紹介と開発の裏側についてお話していきたいと思います。

※アークナイツバトルイラストコンテストのページはこちら: https://www.pixiv.net/contest/arknights

レイドバトル形式とは

pixivでは多数のイラストコンテスト企画を常時開催しています。指定されたテーマに沿ってキャラクター等を描き、審査の結果優秀作品に選ばれたイラストには賞金が授与されたり、実際の商品の販促等に採用されたりします。

今回開催されたアークナイツイラコンもそんなイラコンの1つですが、「レイドバトル形式(レイド形式)」という少し遊び心のある仕掛けが用意されています。イラコンの特設ページを訪れると中央に赤いHPゲージが表示され、イラコン参加作品の総閲覧数に応じて「敵」がダメージを受けます。HPが0になると敵は撃破となり、次の敵が現れます。期間内に全部で6体の敵を倒すことが出来ればユーザー側の勝利となります。

f:id:pxvpxv:20200618154342p:plain
画面は開発中のものです

似たような形式の企画として、2017年にはアズールレーンイラストコンテストが、2019年にはpixivファンタジア Last Sagaが開催されています。ただ特に今後はアークナイツを皮切りにレイド形式のイラコンを次々と開催していきたいと考えており、そのための汎用化も意識しながら開発しました。(イラコンを検討されているIPホルダー様には是非レイド形式もご検討いただければ幸いです!)

今回のアークナイツイラコンはお陰様で累計860万閲覧数を突破し、過去最高の閲覧数となっています。また投稿作品数も4,900作品と歴代トップクラスでした。

レイド形式を支える技術

今回私はバックエンドを担当し、フロントエンドは時間や必要な技術スタックの都合上他のチームメンバーに依頼しました。

コンテストCMS

pixivではイラコン・小説コンテストを管理する「コンテストCMS」というPHP製の社内システムを通じて多数のコンテストを円滑に運用する仕組みがあります。今回レイド形式のイラコンを実施するにあたり、レイド形式の仕組みを汎用化したいと考え、コンテストCMSに組み込むことにしました。

コンテストCMSは一言で表すと巨大なJSON生成器です。コンテストの情報を設定すると、JSONにして吐き出してくれます。これをpixiv本体の方で受け取りパースして、必要な情報や画像を必要な場所にセットしていきます。

f:id:pxvpxv:20200618154620p:plain
コンテストCMS

バッチ処理

レイド形式では日々の閲覧数を計測し敵にダメージを与える必要があります。これはPHPでバッチ処理を書き、古き良きJenkinsで回すことで実現しています。バッチ内ではピクシブ内部で使われている検索エンジンのSolrに問い合わせ、コンテスト参加タグのついたイラストの作品ID一覧を取得します。マイピク限定公開や非公開、削除済み、参加タグが投稿者本人以外によって付与されている等の場合は集計対象から外す必要があるので、それらの情報を作品IDのインデックスを使ってMySQLに問い合わせます。イラスト毎の日々の総閲覧数はGoogle BigQueryに送られ、作品ごとに前日との差分を計算してそれらの和をその日のイラコン全体の総閲覧数とし、MySQLに記録します。

作品ごとに日々の閲覧数を記録しておくのは、投稿した後時間差で参加タグが付与された場合や、途中で作品が非公開にされたり削除されたりした場合にも閲覧数を正しく計算するために必要な仕組みです。地味ですがこの辺りは神経を遣って設計する必要があります。

f:id:pxvpxv:20200618154749p:plain
レイド形式コンテスト -システム構成-

表示処理

最後に実際に画面を表示するためのバックエンド(およびフロントエンド)を実装しました。ここでのポイントは必要な情報のみをフロントエンドに渡すこと、そして複雑な条件分岐を網羅することです。

次以降のラウンドで出現する敵は秘密なので、まだ当該ラウンドに到達していないのにフロント側に画像URLを渡すと、ある程度専門知識のある方であれば画像を参照してネタバレが出来てしまいます。そのため必要な画像を閲覧数(=敵に与えるダメージ)から計算し、それらの画像のURLのみがバックエンドからフロントエンドへ渡されます。もちろんURLはハッシュが付加されているため、ファイル名の規則性から類推することは出来ません(これはコンテストCMSの機能)。

また、今回は最終ラウンドの敵のみ最大HPが不可視という設定でした。当然フロント側に最大HPや残りHPの情報を渡してはいけません。そしてコンテスト最終日翌日の更新タイミングで初めてHP情報を渡し、HPが削り切られていれば「完全勝利」に切り替わる仕組みになっています。

まとめ

レイド形式は一見単純なシステムに見えるかもしれませんが、このようにあらゆるエッジケースを考慮する必要があり、1ヶ月半ほどの開発期間を経てようやく完成に漕ぎ着けました。大変な時期もありましたが、そのたびにアークナイツをプレーしてモチベーションを上げながら開発に勤しみ、無事リリースすることが出来ました。

結果としてアークナイツイラコンという場で4,900もの作品と出会うことができ、微力ながら多くのアークナイツの二次創作作品が生み出される一助を担えたことを大変嬉しくまた光栄に思います。ユーザーの皆様に少しでも楽しんでいただけたなら、そしてアークナイツというコンテンツを盛り上げられたなら幸いです。

弊社のアドプラットフォーム部では今回のようなレイド形式、および通常のイラストコンテストを開催したいというIPホルダーや広告代理店の皆様からのお問い合わせを受け付けております。詳細や実際のお問い合わせにつきましては広告掲載についてのページをご覧ください。

また、弊部署では普段は月間300億リクエストをさばく広告配信システムをKubernetes (GCP)・Golang・Ruby on Railsを中心に運用する他、Google BigQueryやLooker(BIツール)を使ったCTR向上のための分析、Pythonによる広告収益の自動集計等、様々な挑戦を続けています。我こそはというエンジニアの方のご応募をお待ちしております。

icon
myonsawa
2017年新卒エンジニア。弊社テックカンファレンスの余興ではアニソンDJでフロアを沸かし、週末はボドゲに貴重な20代後半を溶かすなど活動は多岐に渡る。年間約20回の音ゲー禁に成功した経験を持つ。