いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity ECS : JobComponentSystem が not run になる場合はEntityの状態を確認しよう

JobComponentSystem を使っているときに、OnUpdateが一回だけ呼ばれて以降のループが止まる という現象に悩まされたのですが、どうも仕様っぽい動作だったのでメモ。

f:id:sugar_affordance:20191003080051p:plain
not run になっている

下記の Unityドキュメントのサンプル より簡略なシステムを使っていたところ、上画像のように Entity Debugger 上でシステムが動作していない表示になっています。

ログを仕込むと OnUpdate が一度だけ呼ばれてそれ以降出力されないという状態でした。

・確認環境
Unity2019.2.6 ECS 0.1.1

public class GarbageComponentSystem : JobComponentSystem
{

    protected override JobHandle OnUpdate(JobHandle inputDeps)
    {
        
        var job = new GarbageJob() {
        };

        JobHandle handle = job.Schedule(this, inputDeps);

        return handle;
    }

    [BurstCompile]
    struct GarbageJob : IJobForEach<Translation>
    {
        public void Execute(ref Translation translation)
        {
        }
    }
}

で結論ですが、どうも JobComponentSystem の OnUpdate で投入したジョブの処理対象となるEntityが存在しないと、
次回ループからシステムが止まる
らしい。

上のソースを使って not run の状態から、Translation ありの Entityを作成すると、元気にシステムが動き出します。

f:id:sugar_affordance:20191003081450p:plain
Entityを得たJobComponentSystem

しかもデフォルトWorldでは発生せず 自作 World のみ で発生しているのですが原因は不明。

ということで、毎フレーム必ず実行したい処理は 横着してJobComponentSystemのOnUpdateに入れてはいけません。
別システムに切り出すか他の手を考えましょう ToT


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


免責事項

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

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

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