ECSのリファレンスとして使えるの情報がブログとかしか見つからなくて困っていたのですが、公式ページでTransformの解説をしているページをやっと見つけました。
とりあえず各章を流し読みしながら図を追うだけでも勉強になります。
・今回の環境
Unity 2019.2.6
ECS preview 0.1.1
自分的に読んでスッキリした部分をメモ。
位置、回転、倍率はそれぞれ別コンポーネント
GameObjectのTransformの各パラメータにあたるものがそれぞれコンポーネントタイプとして分かれています
Transform.position = Translation コンポーネント
Transform.rotation = Rotation コンポーネント
Transform.localScale = Scale
Scale コンポーネントに設定できるのは float 値1つで、x,y,zで別に設定したい場合は NonUniformScale を使います。ただNonUniformScale はサポートしていないDOTS機能があるようなので、特別なことをしないかぎりScaleを使ったほうがいいでしょう。
Entityを作成したい時は、使いたいコンポーネントタイプをアーキタイプに含めなければなりません。
var enemyArchetype = EntityManager.CreateArchetype( ComponentType.ReadWrite<Translation>(), ComponentType.ReadWrite<Rotation>(), typeof(RenderMesh), typeof(LocalToWorld) );
"使いたいコンポーネント" というのがミソで、値を個別に設定しないものはアーキタイプに含めなくても問題ありません。
というか LocalToWorld さえあれば、他のコンポーネントが何一つなくてもTransform関係のデータは直接書き込めるぽい(面倒だと思うけど)。
LocalToWorld は必須
LocalToWorld コンポーネントはTransform関係の処理をしたいEntityに対しては必ず必要です。
親子関係にした場合も、親にも子にも必ずつけましょう。
親子関係を定義するのは一工夫必要
GameObjectで親子関係を作れるように、ECSを使う上でも親子関係を定義できます。
もちろん親の位置や回転に合わせて子も動く。
子のEntityに Parent と LocalToParent コンポーネントタイプを含める必要があります。
ParentのValueには親のEntityを設定。
Entity childEntity = EntityManager.CreateEntity( typeof(Translation), typeof(RenderMesh), typeof(LocalToWorld), typeof(Parent), typeof(LocalToParent), ); EntityManager.SetComponentData(childEntity, new Parent() { Value = parentEntity });
LODを使いたい場合は、LODのレベルごとにEntityを作成して親子関係にしないとうまくいかないので気をつけましょう。
これに限らずECS関係の仕様が追いにくいこと! みんなどこから一次情報持ってきてるんですかね。
そして Rendering のリファレンスちゃんと書いてほしい...