Unity ECS ScheduleParallel で 値を抽出したい (備忘)


(追記:修正 2021/10/06)
結論は出来て出来ん。
Job理解しきれてなかった。

スケジュール(Schedule/ScheduleParallel)をやってる時点で
メインスレッドからはずれて別の時に実行されます。

1.スケジュールが完了していれば(1~2フレーム待てば)使える。
2.JobをCompleteさせる。(スケジュールの恩寵が薄れる)

横と縦だけじゃなくて時間軸まで意識しないといけなくてワイ、泣きそう。

~~~~やり方~~~~
WithNativeDisableParallelForRestriction()と
WithNativeDisableContainerSafetyRestriction()を使ってください。

・WithNativeDisableParallelForRestriction(myvar)
⇒複数のスレッドが同じ書き込み可能なネイティブコンテナーにアクセスすることを許可。
・WithNativeDisableContainerSafetyRestriction(myvar)
⇒ネイティブコンテナへの危険なアクセスを防ぐ通常の安全制限を無効。

System.cs
    public enum TradeResult{ Success = 0, Fail = 1 } 

    protected override void OnUpdate() 
    {
        var results = new NativeArray<TradeResult>(2, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
        var members = new NativeArray<Entity>(2, Allocator.TempJob, NativeArrayOptions.UninitializedMemory);
        Dependency = Entities.
            WithNativeDisableParallelForRestriction(results).     // 重要なところ
            WithNativeDisableContainerSafetyRestriction(results). // 重要なところ
            WithNativeDisableParallelForRestriction(members).     // 重要なところ
            WithNativeDisableContainerSafetyRestriction(members). // 重要なところ
            ForEach((Entity member) => {
              ~~~~~~~~~~~~ なんやかんやの処理 ~~~~~~~~~~~
               members[0] = member; 
               results[0] = TradeResult.Success;
               members[1] = member; 
               results[1] = TradeResult.Fail;
              ~~~~~~~~~~~~ なんやかんやの処理 ~~~~~~~~~~~
            }).ScheduleParallel(Dependency);
        var dataFromEquipment = GetComponentDataFromEntity<Translation>();
        Dependency.Complete(); // 2.JobをCompleteさせる
        Debug.Log($"{results[0]}-{results[1]}"); // => Success - Fail
        if (dataFromEquipment.HasComponent(members[0])) Debug.Log($"Exist Position {dataFromEquipment[members[0]]}");
        if (dataFromEquipment.HasComponent(members[1])) Debug.Log($"Exist Position {dataFromEquipment[members[1]]}");
        results.Dispose();
        members.Dispose();
      }

参考:https://note.com/npaka/n/n75c418080ff0