【Unity】Hybrid ECS + MeshInstanceRenderer

前回でHybrid ECSを使ってUpdate() 部分をマルチスレッド化してみた。

やはり描画負荷が高いよね。
MeshInstanceRenderer を使いたくなる!!
調べても使い方が難しく意味が分からん!(じゃぁこの投稿は何だよw

MeshInstanceRenderer

試しにGameObject アタッチしメッシュやマテリアルを設定しても描画してくれないよね。
理由はTransformの情報がない(?)かと思います。

じゃ、ネットでMeshInstanceRendererについて調べたら、

var manager = World.Active.GetOrCreateManager<EntityManager>();
var archetype = manager.CreateArchetype(...); // Position とか Rotationとか
var entity = manager.CreateEntity(archetype);
var look = ... // MeshInstanceRenderer
manager.AddSharedComponentData(entity, look);

と、今まで使って来なかった書き方をヒットします。

やりたいこと

従来の概念をあまり捨てないでどうやってMeshInstanceRendererを使うか?
(ECSの考えにあってるかどうかわからんが) 書きました。
gist.github.com

上記のコンポーネントをGameObjectにアタッチすると、

PositionComponent
RotationComponent
MeshInstanceRendererComponent
CopyTransformFromGameObjectComponent

を勝手にアタッチしてくれます。
なぜか ScaleComponent の情報がコピーしてくれないので、今回は無視する!

Awake() 時に、
MeshFilter と MeshRenderer があれば
情報を取得し MeshInstanceRenderer にセットする
ついでにMeshRendererも無効に!

実行結果

f:id:kou_yeung:20181108165006g:plain
160FPS 以上になりました。
これぞ Hybrid ECS!!

次回:
【Unity】Hybrid ECS から Pure ECS へ - 浮遊島