【Unity2019.1】Entity Comonent Systemで自前Worldを作成する方法【ECS】
https://qiita.com/pCYSl5EDgo/items/fd08d54422b232b92e28
現在のUnity ECSで複数の自前Worldを動かせるようになっていたので、こちらの記事を参考にしつつ方法をまとめます。
環境
- Unity 2019.3.5f1
- DOTS Editor 0.4.0-preview
- Entities 0.8.0-preview.8
デフォルトのWorld生成を無効にする
Project Setting
>Player
>Scripting Define Symbols
に
UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP
を追記してください。
セミコロンでシンボルを複数指定できます。
自前Worldを動かす
var world = new World("MyWorld");
var systemTypes = new List<Type>();
systemTypes.Add(typeof(HogeSystem));
systemTypes.Add(typeof(FugaSystem));
systemTypes.Add(typeof(AwesomeSystem));
// ルートの3つのComponentSystemGroupにSystemを登録してくれる便利なメソッド
DefaultWorldInitialization.AddSystemsToRootLevelSystemGroups(world, systemTypes);
ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world);
UpdatePlayerLoopを呼ぶことで自前Worldを動かすことができます。
AddSystemsToRootLevelSystemGroupsはデフォルトWorldにSystemを登録する際に使用されていますが自前Worldでも使えます。
自前Worldを追加する
var worldA = new World("MyWorldA");
var worldB = new World("MyWorldB");
var worldC = new World("MyWorldC");
// Systemなど登録
ScriptBehaviourUpdateOrder.SetPlayerLoop(PlayerLoop.GetDefaultPlayerLoop());
foreach(var world in World.All)
ScriptBehaviourUpdateOrder.UpdatePlayerLoop(world, ScriptBehaviourUpdateOrder.CurrentPlayerLoop);
UpdatePlayerLoopには、既存のPlayerLoopにWorldの更新処理を挿入するためのパラメータがあるので、CurrentPlayerLoopを指定してあげましょう。
https://docs.unity3d.com/Packages/com.unity.entities@0.8/api/Unity.Entities.ScriptBehaviourUpdateOrder.html#Unity_Entities_ScriptBehaviourUpdateOrder_UpdatePlayerLoop_Unity_Entities_World_System_Nullable_PlayerLoopSystem__
まとめ
APIが大幅に変わってたりしてわからん。日本語の情報がまだまだ少なくてわからん。なんもわからん。
(デフォルトでCurrentPlayerLoop.subSystemListがnullなのはバグですか…?)