【Unity】ECS(Entity Component System)を勉強してみた①【DOTS】
- DOTSとは?
- ECS(Entity Component System)とは?
- ECSの構成要素
- Entity
- Component Data
- Component System
- Component Group
- World
- ECSの導入
皆さんは「DOTS」(Data-Oriented Technology Stack)をご存知でしょうか?
DOTSとは?
最新のマルチコアプロセッサを利用した、ゲームの高速実行、可読性、再利用に長けた最新のハイパフォーマンスなUnityのコアです。
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を使ってみようと思います!
参考