いんでぃーづ

ゲームメインのブレブレブログ。ゲーム,Unity,デザイン,UI/UX

Unity ECS : メッシュ表示と物理挙動が有効なWorldを自作する

ECSを使うならWorldは自作すべきと言い切れます。
なんでかというと、ずっとAndroidゲームの起動時間が最低でも5秒くらいかかっていて短縮するためにいろいろ試していたのですが、
結局ECSの デフォルトワールドを無効にしただけで1秒で起動するように なったから...

ただ、メッシュのレンダリングと物理挙動を有効にするためには、必要なシステムを自分でいろいろ付け足す必要があったので、
コピペで使えるソースコード置いておきます。

前準備

Project Settings の Scripting Define SimbolsUNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP を追加します。
これでデフォルトワールドが無効になりました。

f:id:sugar_affordance:20191026111040p:plain

ワールドを自作

次にワールドを作ります。
メッシュのレンダリングに必要なSystemは自分で追加する。

コード上で追加しているSystemをどうやってリストアップしたかというと、
デフォルトワールドを有効にした状態でゲームを動かし、Eneity Debugger 上で動いてるっぽいSystemを一個ずつ追加するという非常に泥臭い方法でやりました。

f:id:sugar_affordance:20191026113635p:plain

ので「なんかおかしいな」と思ったら自分で試しつつ追加してね(はーと

※ここにも載ってました

System Update Order | Package Manager UI website

このワールドでは

  • メッシュ表示
  • 物理挙動
  • SubScene読み込み
  • Transform 親子設定

が動作するのを確認できました。

        GameWorld = World.Active = new World("GameWorld");

        // InitializationSystemGroup
        InitializationSystemGroup initGroup = GameWorld.GetOrCreateSystem<InitializationSystemGroup>();
        initGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Scenes.SubSceneStreamingSystem>());
        initGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Transforms.CopyInitialTransformFromGameObjectSystem>());

        // SimulationSystemGroup
        SimulationSystemGroup simuGroup = GameWorld.GetOrCreateSystem<SimulationSystemGroup>();

        simuGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Physics.Systems.BuildPhysicsWorld>());
        simuGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Physics.Systems.StepPhysicsWorld>());
        simuGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Physics.Systems.ExportPhysicsWorld>());

        var tansformSystemGroup = GameWorld.GetOrCreateSystem<Unity.Transforms.TransformSystemGroup>();
        tansformSystemGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Transforms.EndFrameParentSystem>());
        tansformSystemGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Transforms.EndFrameTRSToLocalToWorldSystem>());
        tansformSystemGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Transforms.EndFrameTRSToLocalToParentSystem>());
        tansformSystemGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Transforms.EndFrameLocalToParentSystem>());
        simuGroup.AddSystemToUpdateList(tansformSystemGroup);

        simuGroup.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Entities.EndSimulationEntityCommandBufferSystem>());

        // PresentationSystemGroup
        var preSys = GameWorld.GetOrCreateSystem<PresentationSystemGroup>();
        
        preSys.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Entities.BeginPresentationEntityCommandBufferSystem>());
        preSys.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Rendering.CreateMissingRenderBoundsFromMeshRenderer>());
        preSys.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Rendering.LightSystem>());
        preSys.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Rendering.RenderBoundsUpdateSystem>());
        preSys.AddSystemToUpdateList(GameWorld.GetOrCreateSystem<Unity.Rendering.RenderMeshSystemV2>());

“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.


免責事項

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

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

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