📖

Unity DOTSでマルチプレイヤーゲームを作ろうとしてつまづいた話

2021/12/22に公開

こんにちは、『あんさんぶるスターズ!!Music』開発エンジニアのF. S.です。

僕の考えた最強のリアルタイム通信基盤(検討編)〜みんなでライブの場合〜」という記事を去年のアドベントカレンダーで書いたのですが、そちらでの知見を生かしてマルチプレイヤーゲームの基盤について調査しました。
Happy Elementsカカリアスタジオでは、全てのプロジェクトでUnityを採用しており、Unityの利点を生かすためにDOTSという機能群を試してみることにしました。
DOTSを使ってマルチプレイヤーゲームを作ろうとしてうまくいかなかった話を書いていきます。

※ これは2021年10月くらいでの状況であり、今後は大きく変わっていくかもしれません

DOTSとは

DOTSとはData-Oriented Technology Stackの略称で、今までのオブジェクト指向での作り方をやめて、データ指向によるデザインを行ってキャッシュヒット率を上げ、処理の高速化を図っていく方法を提供する一連の機能群です。
2019年ごろからUnityが力を入れていた印象で、3本柱の2つであるJob System, Burst Compilerは既に製品版として使用可能となっています。
一方で、データ指向によるデザインの核となるEntity Component Systemはプレビュー版のみが提供されている状態です。
詳しくは、Unityの公式ページをご確認ください。

https://www.youtube.com/watch?v=BNMrevfB6Q0

Uniteコペンハーゲン(2019)にてDOTSについての発表が多く行われた

なぜDOTSを使おうと思ったのか

去年のアドベントカレンダーにも書いているのですが、Unityはマルチプレイヤーゲームの基盤としてDOTS Netcodeを推していました (参考記事ではDOTSに関する記載は削除されている)
当時の個人的な感想としては、同時接続数の多いマルチプレイヤーゲームの多くはUnreal Engineで作成されており、Unityにはそれに対抗するだけの機能が不足していると感じていました。
その中で、マルチプレイヤーゲームを作るためのエンジンとしてUnreal Engineを使わずにUnityを使うなら、Unreal Engine以上のパフォーマンスを発揮できるような魅力的な機能が必要でした。
それがDOTSであり、DOTSを用いたマルチプレイヤーゲームの基盤を用いれば、Unreal Engine以上の適切な環境を準備できるのではないかと考えました。
(現在はDOTS NetocodeではなくUnity Netcodeと呼ばれています)

とは言え、前評判としてはサンプルがエラーで動かないなどの噂があり不安だったので、DOTSNETというAsset Storeで評判の良いマルチプレイ用基盤をまず使ってみることにしました。

DOTSNETとは

DOTSNETはMirrorというUnity用ネットワークライブラリを提供しているvis2kさんとその仲間たちが開発しています。
Mirrorは現状のUnityで動く最もスケーラブルで使いやすいマルチプレイヤーゲームの基盤として知られており、Unityが調査した資料にもその結果が反映されています。

DOTSNETはサンプルに小さな不具合はあったものの、クライアント・サーバーのビルドも行って動作確認ができました。
ある事件が起こるまでは精力的に開発が進められていて、最も良い選択肢だったと感じています。

DOTSNETを使えなくなった事件

DOTSの進捗を気にしている方なら既に知っているかもしれませんが、4月にDOTSのEntitiesがUnity2021に対応されないお知らせがフォーラムに投稿されました。
Entity Component Systemがいつまでも製品版にならないことに開発者は既に不満を感じている状態でしたが、この発表によりUnityがDOTSの開発を諦めるのではないかという疑念を多くの人が抱き、このフォーラムにはそれに関する質問が寄せられました。
ここでUnityの開発者が適切に回答していれば何もなかったと思うのですが、多くの質問に答えることができずに回答を停止する事態に陥りました。

vis2kさんはその対応を見て、適切な対応が行われるまでDOTSNETの開発を停止することをDiscordサーバーにてユーザーに共有しました。
私たちもいつ開発再開されるかわからないライブラリを使い続けるわけにもいかず、DOTSNETの使用を諦めることにしました。

Unity Netcodeを試す

ここで改めて、Unity公式が提供しているUnity Netcodeを試してみることにしました。
まずはマニュアル通りに動作確認をしてみて、特に問題なく動いていたのでそのままサンプルを参考にマルチプレイヤーゲームの基本的な機能を試しに作っていました。
こちらも問題なく動いていたので安心していたのですが、いざ自分たちの作りたいものに適用してみると問題が判明していきました。

SpineがDOTSのEntitiesに対応してくれなそう

マルチプレイヤーゲームを作る場合、2Dスケルタルアニメーション作成ツールであるSpineを使用したいと考えていました。
SpineはDOTSに対応するという想定だったのですが、どうやらJob Systemには対応してもEntity Component Systemには対応しないようでした (参考)。
私たちは、Spineではない方法で2Dアニメーションを行うために調査を始めました。

2D EntitiesはProject Tinyでしか使用できない

DOTSで2Dを扱うためには、2D Entitiesというパッケージを使用する必要があります。
2D EntitiesはProject Tinyという小規模なスタンドアローンゲームをDOTSで作るためのものでしか使用できず、Unity Netcodeを同時に使用することができないことがわかりました。
また、Project Tiny以外で2D Entitiesを使えるようにする試みもUnity側で行う予定がないこともわかりました(参考)。

Unity Netcodeのサーバーがうまく動作しない

同時並行でクライアント・サーバーのビルドをして動作確認しようと試みました。
ビルド自体は成功するのですが、実際に動かしてみるとエラーが起こっているようでした。
フォーラムではエラーの原因が突き止められていましたが、Unity Netcode 0.8で解決する予定となっており、0.8がリリースする目処が立っていないことから実機での動作確認ができない状態であることがわかりました。

DOTSでマルチプレイヤーゲームを作ることを断念する

このようにいくつかの試行錯誤を行ったのですが、残念ながらDOTSでマルチプレイヤーゲームを作れる状況ではないと判断しました。
もしかするとUnity2022ではこの辺りが解決されたりするのかもしれませんが、現状を見るとかなり難しそうだと感じました。

現在は他の選択肢 (Unreal EngineやMLAPIなど)を視野に入れて調査を進めています!

まとめ

DOTSでマルチプレイヤーゲームを作ろうとしてつまづいた話を書かせていただきました。
備忘録的に他の方にも参考にしてもらえたらうれしいです。

GitHubで編集を提案
Happy Elements

Discussion