ECSを使うならWorldは自作すべきと言い切れます。
なんでかというと、ずっとAndroidゲームの起動時間が最低でも5秒くらいかかっていて短縮するためにいろいろ試していたのですが、
結局ECSの デフォルトワールドを無効にしただけで1秒で起動するように なったから...
ただ、メッシュのレンダリングと物理挙動を有効にするためには、必要なシステムを自分でいろいろ付け足す必要があったので、
コピペで使えるソースコード置いておきます。
前準備
Project Settings の Scripting Define Simbols に UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP を追加します。
これでデフォルトワールドが無効になりました。
ワールドを自作
次にワールドを作ります。
メッシュのレンダリングに必要なSystemは自分で追加する。
コード上で追加しているSystemをどうやってリストアップしたかというと、
デフォルトワールドを有効にした状態でゲームを動かし、Eneity Debugger 上で動いてるっぽいSystemを一個ずつ追加するという非常に泥臭い方法でやりました。
ので「なんかおかしいな」と思ったら自分で試しつつ追加してね(はーと
※ここにも載ってました
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>());