ECS(Entity Component System) 基礎中の基礎

ECS(Entity Component System) 基礎中の基礎

原点回りにCubeが回転するだけの単純なサンプルです。

Script

 CubeDataで使用するデータを定義します。

CubeAuthoringではEntityを取得し、そのEntityにCubeData Componentを追加しています。よって、CubeAuthoringにはCubeを動かすための処理はありません。また、GetEntityでTransformUsageFlags.Dynamicを指定した場合、LocalToWorldとLocalTransform Componentが追加されます。

Cubeを動かすための処理は以下のScriptで行います。このように、ECSではデータと処理を分けて記述する必要があります。また、このSystemは動かすために何かする必要はなく、自動的に実行されます。Cubeを動かすためにはCubeDataとLocalTransformの取得を行い、CubeDataをもとに計算を行いLocalTransformを変更する必要があります。よって、SystemAPI.QueryでこれらのComponentを取得します。SystemAPI.Query内のRefROは読み取り専用、RefRWは読み込みだけではなく書き込みができることを示します。そして、Componentから値を取得する場合はValueRO、書き込みを行う場合はValueRWを使用します。

SystemAPI.Queryについて

 SystemAPI.Queryでは指定したComponentを有するEntityのComponentを取得できます。複数のComponentを指定した場合、それらを有するEntityのComponentのみを取得します。

 例としてEntityを作成する際にTransformUsageFlags.Dynamicを指定したCubeAとTransformUsageFlags.Noneを指定したCubeBを使用します。(Burstを利用する場合はstringが使用できないのでFixedStringを使っています。)

TransformUsageFlags.DynamicはLocalTransformが追加されますが、TransformUsageFlags.Noneは追加されません(Colliderがある場合は自動的にLocalTransformが追加されます)。この条件でSystemAPI.QueryへCubeDataのみ指定するとConsoleにはCubeAとCubeBが表示されます。

次に、SystemAPI.QueryにLocalTransformを追加します。

これを実行すると、LocalTransformを持たないCubeBは除外されるため、ConsoleにはCubeAのみ表示されます。

設定と実行結果

 以上のScriptを利用してCubeを回転させます。始めに、SubSceneを作成します。作成したSubSceneの横に表示されているチェックボックスにチェックを入れます。

次に、Cubeを作成し、SubSceneへ移動させます。

最後に、作成したCubeへCubeAuthoringを追加します。

実行すると以下のように、原点回りにCubeが回転します。

参考ページ

Youtube:はじめての Unity ECS – Entity Component System を使ってみよう!