LoginSignup
2
0

More than 3 years have passed since last update.

Unity ECSで自前Worldを複数動かす

Last updated at Posted at 2020-03-21

【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なのはバグですか…?)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0