いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : ECSのTransform関係の仕様を理解するためのリファレンス

ECSのリファレンスとして使えるの情報がブログとかしか見つからなくて困っていたのですが、公式ページでTransformの解説をしているページをやっと見つけました。

docs.unity3d.com

とりあえず各章を流し読みしながら図を追うだけでも勉強になります。

・今回の環境
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に ParentLocalToParent コンポーネントタイプを含める必要があります。
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 のリファレンスちゃんと書いてほしい...

Rendering | Package Manager UI website


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。