Unityにおける通信APIを色々試して罠を踏んだ話

初めまして、2014年新卒入社でQualiArtsの技術基盤グループに所属する石黒です。グループ名の通り、特定のプロダクトを開発しているわけではなく、共通で使われる様々な基盤サービスの開発に携わっています。例えばユーザー認証、課金、リアルタイム通信、チャットなどなど。その中に、弊社のUnityアプリ共通で使われているAssetBundle配信基盤Octoというものがあります。

Octoは、Unityアプリを開発する上で欠かすことのできない要素の1つであるAssetBundleを、管理・配信するための基盤となります。開発・運用コストを下げるためや品質を担保するために、全サービス共通化を目指してOctoの開発が2015年秋頃にスタートしました。Octoを初めて組み込んだサービスがリリースされたのは2016年夏にリリースされたオルタナティブガールズで、それ以降ボーイフレンド(仮)きらめき✩ノートやエンドライド -X fragments-にも組み込んでリリースされています。
そんなOctoは、サーバーはもちろん開発が必要でしたが、ゲームの自由度を上げるためと標準のUnityのAPIよりパフォーマンスを出すため、クライアントSDKも同時に開発しました。そこで今回は、そのOctoのクライアントSDKを実装して得られた、Unityにおける各種通信APIを試行錯誤した話を紹介します。
通信の重要性
まずなぜ通信が重要視されるかと言えば、以下のようにスマホにおける通信について考慮すべき課題が多数あるからです。
- 通信によって待たされる時間
- 通信するための費用
- 通信することによって消費するバッテリー
- 通信異常時の適切なハンドリング
- 通信内容の保護
そのため、通信がユーザー体験に与える影響は非常に大きいものになります。
エンドユーザーの通信環境は年々改善されていますが、通信が必要なくなることはないと容易に想像できるので、開発者はこれからもずっと向き合っていかなければいけません。これらの課題に対応するため、より一層通信APIを使いこなすことが求められていきます。
Octoでの通信パターン
以降具体的にUnityの通信APIについて説明していきますが、Octo的な事情も通信部分の設計に反映されています。そこで具体的な説明の前に、まずはOctoでの通信APIを設計する大前提を説明します。Octoで実際に扱う通信パターンは以下の2種類です。
- 1シーケンスあたり1本程度のAPIサーバーとの通信
- 1シーケンスあたり1〜1000本程度のAssetBundleダウンロード処理