ゆーとぴあ。ブログ

技術の備忘録や、日記などを投稿します

【Unity】ECS(Entity Component System)を勉強してみた①【DOTS】

 

皆さんは「DOTS」(Data-Oriented Technology Stack)をご存知でしょうか?

 

DOTSとは?

最新のマルチコアプロセッサを利用した、ゲームの高速実行、可読性、再利用に長けた最新のハイパフォーマンスなUnityのコアです。

unity.com

DOTSには主に以下の3つが含まれています。

  • C# Job System
  • ECS(Entity Component System)
  • Burst Compiler

 

今回からはこのうち、ECSについて勉強して行きたいと思います。

 

ECS(Entity Component System)とは?

今までのMonoBehaviour/Componentの考えより、物量ゲーを超高速に動作させることができるアーキテクチャです。

つまりどういうことかというと、これまで大量のオブジェクト(GameObject)を生成する場合、その生成や削除だけでも重いのに加え最適化させるためにオブジェクトをプーリングさせる設計にしたりと複雑なロジックが必要になってきました。

それが、ECSではGameObjectを生成する必要がないのでめちゃくちゃ早くなります。

この考え方はオブジェクト指向ではなく、構造体主体のプログラミングとなっており、圧倒的にメモリ効率がよくなります。

 

ECSの構成要素

ECSを構成しているのは以下の3つです。

  • Entity
  • Component Data
  • Component System

この3つに加え、2つの仕組みがあります。

  • Component Group
  • World

 

Entity

GameObjectに相当する"モノ"を表す実体の構造体です。

ECSでは、Entityを実体1つとし、各Entityに対して処理を行うという感じになっています。

EntityはEntityManager型のオブジェクトの元で管理されています。

 

Component Data

MonoBehaviourに相当するフィールドを表す構造体です。

Unity.Entities.IComponentDataというInterfaceを実装しています。

Entityに格納するデータだと思ってもらえれば分かりやすいと思います。

 

Component System

ComponentのUpdateやLateUpdate内の処理に相当します。

入力や描画、非同期など様々な処理を行う存在です。

通常はComponentDataを持つEntityが存在する場合にのみ動作しますが、

[AlwaysUpdateSystem]Attributeをつけることで存在しなくても動かすことができます。

Component SystemはScriptBehaviourManagerという基底クラスから継承してます。

(EntityManagerもScriptBehaviourManagerの派生になってます。)

 

Component Group

ComponentDataの種類を設定し、ComponentSystemが処理する対象Entityのフィルタリングをする役割になっています。

 

World

ComponentSystemやEntityManagerが属する仮想空間です。

ScriptBehaviourManagerの派生となるインスタンスは各Worldに1つずつ存在し、必ずWorldに属しています。

 

ECSの導入

Project Settings > Scripting Runtime Versionを.NET 4.xに設定

(2018.3からデフォルトが.NET 4.xになっているため設定する必要なし)

Package ManagerからEntitiesをインストール

Project Settings > Scripting Define Symbolsに「UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP」を追加

 

今回はここまで!

次回から実際にUnityでECSを使ってみようと思います!

 

 

 

参考

qiita.com