Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

DOTSで玉転がしゲームを作ってみた!前編 [ Unity_2019.3x, Entities_0.6 ]

 Unityの新たな可能性の一端を示すUnity 2019.3ですが、その中でDOTSの開発は大きく進み、プレビュー版ではありますが自分なりにいろいろ試しています。まだ分からないことが多いですが、かなり面白いです!

[ 追記 2023/06 ]

 Unity 2022 LTSにて、ECS(Entities)が正式版となりました。それなりに多くの部分で変更があり、本記事とその後編は共に内容的には古いモノになってしまっています。しかし、記録としてそのまま残しておきますのでご了承ください。

 

 『とにかく簡単なモノを作ってみる』というのはプログラミング学習における定石であるので、とりあえずUnityのチュートリアルとしても代表的な玉転がしゲーム"Roll a Ball"をDOTSで作ってみました。

  少し前置きが長くなってしまったので、前半後半に分けています。前半では、今回初めてDOTSと向き合い、実際に使ってみてどう思ったのかが中心の内容です。 

※[更新]後半記事をアップしました!

 

f:id:miur-us:20200304233443j:plain

 

注意点!

 DOTSに関わるパッケージやそこに含まれるライブラリの多くは、まだまだ開発途中のプレビュー版です。プレビュー版の不具合による被害は保証されません!そしてAPIなども今後変わっていく可能性があり、記事内のコードも動かなくなるかもしれないので、あくまで参考程度に見て頂ければ幸いです。また単純な間違い、理解不足もあるかもしれません。

 

DOTSの可能性がスゴイ!っぽい

 近年のUnityはいろいろな変化や進化がありますが、その中でも特に目玉なのがDOTSです。

DOTSとはData-Oriented Technology Stackの頭文字を取ったもので、

ECS(Entity Component System)

JobSystem

Burst (Burst Compiler)

 という三つの技術をまとめたものですが、以前のDOTSを利用するためコードというと、かなり難解で複雑そうなC#コードを書かなければならず、これはちょっと自分には無理だなーと覗いてひとまず離れてしまっていました。しかし最近の改定でそれなりに分かりやすいコードでDOTSを利用できるようになったので触ってみた、というのが今回の経緯です。なにより、DOTSへの興味というのはUnityのパフォーマンス改善への期待から、かなり強くありました。

 少しずつですが、上のような解説動画やデモプロジェクトなども出て来始めていたので、そのおかげもあります。

 

 現在、恥ずかしくないクオリティを持ち、評価も受けているUnity製のゲームがどんどん出てきています。しかし、この令和の時代になんとも言えない動作感を出すUnityゲームがあるのも事実であり、自分だけでなくUnityのパフォーマンス向上というのは多くの開発者を悩ませていたテーマです。(もちろん開発者がきちんと対応すれば、従来のUnityでもそれなりのパフォーマンスが出ていたのですが)

 

 C#コーディングする以上、パフォーマンスが犠牲になることは仕方ない・・・しかし、Unityは意外なパラダイムシフトでこの問題の解決を図ります。それがこのDOTSであり、データ指向という考え方でした。

 今回の"Roll a ball"ゲーム作成のためにDOTSに初めて取り組んだ感想としては、少し苦労もしたけどDOTSの考え方が単純に面白いと思いました。そして結果としてのパフォーマンス向上が明らかに見て取れたので、この新しい技術を学ぶ決意ができた!という感じです。

 

DOTSへの不安とデータ指向の可能性

 もちろん開発途中であり、まだなんとも言えない部分が多い技術であるのは確かです。しかし、今回のようなシンプルなゲームはまだいいとして、もう少し規模の大きいゲームやAAA規模のゲームでこのDOTSは適用できるだろうか?という不安、疑問を抱きました。

 

 データ指向とは言わばアンチ・オブジェクト指向ではないかと思います。オブジェクト、つまりプログラム内部のモノや存在を中心に捉えるのではなく、データを中心にプログラミングを考える、という考え方です。

 ECSはゲームワールド及びそこにあるオブジェクト達をどう表現し、処理するかのためのシステムで、Entityはいわゆる従来のGameObjectに代わるモノを表す単位です。しかし、Entityはあくまでデータテーブルの行番号を表す程度のものでしかなく、システムとしてはデータ主体で動きます。

 

  というか、そもそもコンピュータが扱うものは全てデータであり、そのデータを抽象的なオブジェクトとして定義し、問題解決を図るオブジェクト指向はむしろ人間本位な考え方だったはずです。巨大なプログラムをクラス単位で分割する、というのは妥当な方法論であるはずですが、その分割や抽象化、クラス間の連携が難しいために批判も多い手法なのかもしれません。

 なので、たぶんデータ指向とは、もっと単純に物事を考えよう!というコンピュータの本来の姿に近い方法論なのだと思います。

 

 今回、DOTSプログラミングでの作業工程は大きく分けて二つで、『関連する変数をまとめたComponent Data』を作り、『Component Dataからデータを入力し、処理したデータを出力するジョブコンポーネントシステム』を作るというものです。

 

発想の転換

 そう考えると、むしろオブジェクト指向におけるどうデータをまとめるべきか?(カプセル化すべきか?)の分割の規模は緩くなっていると考えられます。

f:id:miur-us:20200304233708p:plain

オブジェクト指向はデータの集まりを人物かのように抽象化する

 オブジェクト指向というのは、クラスという単位でプログラムを分割して人間がとらえやすいように抽象化し、実行時にはそのクラスから生まれたインスタンスが主体性をもっているかのように振舞い、各々処理していく、という考え方です。

 

 データ指向はそうではなくて、必要なデータ群を単純な構造体(struct)として定義して、『振舞い』は持たせない。そうして出来たComponent Dataを組み合わせて、Enitityを表現するが、Entityはあくまで個を区別する目印程度のものでしかなく、関数はデータから切り離し、ジョブシステムをひとつの関数として定義していく、というものです。Entityは振舞わず、システムもEntity自体はほとんど意識せず、データを主眼に動いているような構造になっています。

 

 慣れさえしてしまえば、オブジェクト指向よりも簡単になる部分は多いように感じました。必要な変数とその名前を考え、いかに必然性のあるまとまりにするか。また、やりたいことを実現するにはどんな処理を理解し、その問題を解決する関数の名前を考える、というプログラミングに必要な作業というのは変わらずに、その視点を変えた考え方にものすごく興味が湧いています。

 

次回へ続く 

 前述したように、大規模なゲームでこうした細分化していく考えは通用するのか、多くのスクリプトをちゃんと管理できるのか?という不安を実際の作業をしながら感じたのは事実ですが、触っているうちに「これ相当革新的じゃね?」と思いましたし、自分はあくまでインディ個人開発者だし、とにかく面白そうだからやってみるわーという態度に臨んでいこうと決意しました。

 

 というわけで、後半では実際にDOTSで作ったRoll a Ballの中身を見ていきたいと思います。

DOTSで玉転がしゲームを作ってみた!後編 [ Unity_2019.3x, Entities_0.6 ]