見出し画像

Unity ハイパフォーマンスゲーム制作入門 Vol.1

Unityで手軽にハイパフォーマンス

(この記事はUnityを使ったことがある人を対象としています。)

 みなさんはゲーム開発で、どのような開発エンジン/フレームワークで開発されていますか?いくつかの選択肢の中、Unityは幅広いデベロッパーに受け入れられやすい環境や料金体制であることから強い人気を集め、特にモバイルゲームにおけるシェアは50 %以上であると言われています。そんな手軽なUnityですが…

Unityでの開発中、こんなことで困ったことはありませんか?
・挙動が極端に重い
・電池消費が激しい
・発熱が大きい
・読み込みが長い
・ダウンロードコンテンツサイズが大きい
・非同期処理がしづらい、書きづらい、コールバックを書きたくない
・マルチプレイにするためにサードパーティのライブラリが必要だったりするけど、課金が必要
・ClientHostでだとチートなどが不安
・物理演算をマルチプレイで同期するのは不可能…?

などなど、筆者も実際に体験したこともあります…

それDOTSで解決しましょう!

 これらの原因の根本としてUnityEngineがメインスレッドプロセスでの動作を前提としていることや、MonoBehaviourの処理コストが大きいことが原因として挙げられています。そこで、これら共通の原因を解決するべくUnity Technologies社が次世代の Roadmapとして開発しているのが、Unity DOTS(Data Oriented Technology Stack )なのです。
ですから、DOTSで処理速度や電池消費、非同期処理やマルチプレイなどの悩みも解決できるのです!

ところでUnity DOTSって何?

 データ指向設計というパフォーマンスの高い設計方法をUnityがまとめて提供したものです。具体的にはECS architecture(アーキテクチャ)として開発されています。これは2016~2017年のUniteで発表された、既存のGameObjectとMonoBehaviourで作られる DataとBehaviour(行動)を記述する仕組みとは異なり、Entityと Component、Systemを使ったデータ指向設計を提供し、さらに併用できる高速化技術をまとめ、DOTS(Data Oriented Technology Stack )としてまとめて提唱しています。

なんだか難しそうなんけど…?

安心してください。w
確かにデータ指向設計という聞き慣れない設計手法ですが、このハイパフォーマンスゲーミング入門を購読していただければ実際にゲームを作りながら、手軽にハイパフォーマンスなゲーム開発を誰でも可能とする方法を丁寧に解説いたします。筆者は業務でUnity DOTSを使用する現役のエンジニアです。

DOTSでサステナブルなゲームプログラミング

 基本的には非効率的な処理を減らすという方向性で開発されているといって良いでしょう。これにより、モバイルではバッテリ消費を抑えることが出来たり、処理でない無駄なエネルギーを削減することができます。また、[Tinyプロジェクト](https://unity.com/ja/solutions/instant-games)と呼ばれるものがあります。こちらはWeb広告のWebGL環境において、直接ゲームをプレイできるようにすることを目的としたプロジェクトで、100KB〜5MBでゲームを出力することを目標にしています。実際にサンプルプロジェクトでは8MB前後でゲームをビルドすることが出来ました。このように、処理に必要なエネルギーを削減することが出来たり、通信にかかるコスト、エネルギーを削減することで、サステナブルなゲームプログラミングが可能になるのです。
 また5Gの普及により、超高速、低遅延で多数の同時接続ができるようになることから、モバイルでも多人数のマルチプレイへの実現が可能になって来ています。この用途にもDOTSは向いており後述のパッケージ郡を用いることで大人数のマルチプレイで更に物理演算のオブジェクトも同期できる今までできなかったことができるようになる技術郡なのです。

DOTSのメリット・デメリット

 DOTSの技術(パッケージ郡)にはC# Jobs、Burstといった非同期処理を非常に高速化できるパッケージや、物理演算を決定論的にし、さらに高速化したUnity Physicsや、ライセンス料金無しで64人以上の大人数のマルチプレイでも使え、Unity上でサーバー開発が行えるUnity NetCodeというパッケージなどがあります。このようなマルチプレイに対応するサードパーティのライブラリは、例えばphotonだと100接続でも1万円弱したり、monobitでは500接続で月額1万5千円したりします。しかし、Unity Dotsはこのような最先端技術でありながら知識さえあれば、なんと無料で使えるというところに強いメリットがあると思っています。ただし、このパッケージ郡は2021年現在いまだpreview(実験)版とされているので注意してください。 筆者の所感としてはゲーム開発には十分利用できると考えていますが、アップデートされるか分からないリスクなど多少あり、その点はご承知ください。それでもリスクをメリットが十分上回っていると考えています。

メリット
ECS:今まで出来なかったような大量のオブジェクトを高速で処理できる
C# Jobs:記述すればデフォルトでマルチスレッドに対応する
Burst:Jobを高速化する
NetCode:なんとライセンス料金がない(RPCはもちろん、64人以上の大人数のマルチプレイで使える)、Unity上でサーバー開発が行える、チートの心配がない
Live Link:ビルドし直すことなく実機での動作を確認できる

デメリット
いまだpreview(実験)版
ECS:既存の方法(MonoBehaviour)と作成方法が異なる、共存にはテクニックと知識が必要
C# Jobs:外部参照、ネイティブメモリなど制約が強い
Burst:上記同様、エラーログが出なかったり、分かりにくかったりする
NetCode:自分でサーバーを管理運用する必要がある(AgonesやOpenMatchなどの構成についても後に触れる)

DOTSで作られているゲーム

 まだまだ少ないのですが実際にUnity DOTSで作られているゲームがあります。詳細はhttps://unity.com/ja/dots から確認することができます。

Hardspace: Shipbreaker

画像1

(https://unity.com/ja/case-study/shipbreaker より引用)

Steamで配信中のゲームです。ポッドキャストでは、デベロッパーであるBlackbird Interactive社のTrey Smith氏とRichard Harrison氏が、『Hardspace: Shipbreaker』の舞台裏を紹介し、DOTSで何千ものオブジェクトを生成するTipsなどを教えてくれます。

Tic Toc Games

画像2

(https://unity.com/ja/case-study/tic-toc-games より引用)


いくつかのスマホゲームをDOTSで開発したようです。マルチスレッドで処理速度を改善し、バッテリー消費を削減した例などが記載されています。

Far North Entertainment

画像3

(https://blog.unity.com/ja/technology/creating-a-third-person-zombie-shooter-with-dots より引用)

開発中のゾンビゲームに関する紹介とDOTSでのコーディングなどについても記載がアリます。Yotubeでは彼らのUniteの講演を視聴することができます。
Yotube: https://www.youtube.com/watch?v=yTGhg905SCs

DOTSのサンプルゲーム
また少し古いですが公式が提供するサンプルゲームも存在します。
https://unity.com/ja/releases/2019-3/dots-sample
これらがまさにパフォーマンスの課題や非同期処理の課題を解決している例でしょう。

まとめ

今回の記事ではDOTSの概要をご紹介しました。続編の記事では実践的にゲームを作りながらECSの基礎を学び、NetCodeでゲームを作る方法を解説します。

Unityのインストールがお済みでない方はこちら👇

Vol.2はこちら👇

いよいよNetCodeへ、Vol.3はこちら👇


この記事が気に入ったらサポートをしてみませんか?