2019年における個人開発あるいは小規模開発のUnityリアルタイムネットワークの技術選定

概要

Unityネットワーク完全に理解した勉強会でしゃべったことのフォローアップエントリです。

基本的にはPUN2(あるいはPUN1)を推奨していますが、PUNがマッチしないときの技術選定についての話をします。

リアルタイムネットワークゲームをUnityで作る時に考える事

  • 何人同時に動かす必要があるか(つまり、対戦人数)
  • LAN外と通信するかどうか(つまり、NAT越えが必要か)
  • オフラインのLAN環境で動く必要があるか

みたいなことを最初に考える必要があります。
1個目は「PUBGが作りたい、50人が同時対戦するやつを作りたい」と言われるとちゃんとしたエンジニアを集めてください!!で終わっちゃうので、そこは勘弁してください。ラフに言うと10人以上を一緒に動かすのは、結構大変です。

2個目は「ルータの設定やPC設定、あるいはスマホのセキュリティ設定によってP2Pが成立しないことが多い」ので、NAT越えを頑張って、それでもダメならリレーサーバを使う必要があります。
ネットワークエンジンから自作する人は、この辺りも自作することになります。リレーサーバを書くのはめちゃくちゃ大変、と言うわけではないですが、なるべくNAT越えで解決しないとPing増えちゃうのでSTUN、TURN、ICE辺りをゴリゴリやっていく必要があります、この辺は書いてると結構つらいと思います。はい。

ここまで話してて「何言ってるか分かんないな…」みたいに感じた人は、たぶんPUNを使っておくのが一番良いと思います!(あるいはモノビットエンジンもあるのですが、残念ながら僕は触ったことが無いので…ごめんなさい…)

3個目がポイントで、諸事情でインターネットが無い環境でのLAN内動作をしなきゃいけない、みたいなことになるとPUNが使えなくなって死にます。 例えば博物館向け納品とか、おカタい会社向け納品とか、あとTGSなどで回線が死んだ時とか…ですね(遠い目)

この

  • 比較的小人数(x<10)
  • リレーサーバとNAT越えを備えて、つまりネットワーク越しに対戦出来て
  • 必要であればオフラインLAN対戦も成立する

を満たすUnityでの組み合わせは、実は結構少ないです。UNETを使うしかなかったくらいに少ないです…

ただ、UNetを使うと
「ネットワークライブラリ自身のバグを踏む(自分のゲームコードのバグと切り分けるので消耗する)」
「リレーサーバの代金がボッタクリみたいに高い」
「NAT越え出来る確率がめっちゃ低い(さてはSTUNさぼってますね)」
みたいなツラい点と向き合う必要があって、ちょっと大変です。

そこで2019年の僕なら何を選ぶかという話をこれから書きます。

Mirror + NobleConnectという技術選定

ネットワークライブラリをMirrorにして https://github.com/vis2k/Mirror

LLAPIをTelepathyじゃなくてLiteNetLib4Mirrorにして https://github.com/MichalPetryka/LiteNetLib4Mirror

リレーとNAT越えはNobleConnect https://assetstore.unity.com/packages/tools/network/noble-connect-140535

という構成を最近は試しています。

NobleConnectは聞きなれない感じですが、UNet及びMirror向けのNAT越え+リレーサーバソリューションです。積極的にP2Pを使うように気合いを入れたNAT越え実装が入っています。
さらにNobleConnectの会社はマッチメイキングも有料アセットで提供してるので、結構楽が出来ます。

気になるNobleConnectの価格ですがCCU100まではPUNと同額で、それ以上のプランはPUNの約半額といったところなので、ゲームが大ヒットしても安心ですね(?)

また、PUNにあった秒間の通信量制限(秒間500メッセージ制限)も無いので、考える事が減ります。

Mirror + NobleConnectを選ぶことの欠点

  1. ドキュメントがあまりない
  2. 日本リージョンのリレーサーバが無い
  3. 採用例が少ない

という辺りが欠点というかリスクになると思います。

  1. についてはMirror自体のドキュメントは少ないですが、以前よりサンプルも増えていて、またUNETソースからのマイグレーションツールも提供してくれています。 UNET入門 目次 - MOTOYAMA BLOG このUNET入門を読んでおけば、ほぼそのままMirrorでも同じように書けます。
  2. については結構ネックになるかもしれなくて、遅延をなるべく少なくしたいならモノビットさんとか日本リージョンにサーバが置いてあるところの方が良いかもしれません。
  3. については、これを読んだ人が採用例になってほしいです。よろしくおねがいします!

ほかに検討した選択肢

  • Dedicated ServerをMirrorで立ててNAT越えとかを考えなくて済むようにするプラン→Mirrorで書いたマスターゲームサーバが動くVPS代を払うと家計が死にかけたのでボツ
  • MLAPIをネットワークライブラリに採用してMLAPI.Relayを自宅サーバで走らせてリレーサーバにする→さらにドキュメントが少ないのと、MLAPI.RelayはNAT越えに熱心じゃなさそうだったので…でもMLAPIは設計がキレイなので気になっています。LLAPIがENETとUNET LLAPIの2択なのが若干つらいところですが…

最後に

モノビットさん、企業ベースの例は多いけどあまり個人開発者向けのドキュメントそろってなさそうな印象があり、ラーニングパスや、具体的な価格とかをどこかに書いてくれてるとうれしい…(僕が見つけられていないだけかもですが)(どこかにPUNを使わずにモノビットを使うに足る優位性があるはず)