protected override JobHandle OnUpdate(JobHandle jobs) { if (viewCmdStack.Count > 0) { return(jobs); } if (patternMatchRequest.IsCreated) { unswap.Clear(); } var blocksToDelete = new NativeArray <int>(100, Allocator.TempJob); var jobCmdBuffer = cmdBuffer.CreateCommandBuffer().ToConcurrent(); var swapTestJob = new SwapTest() { level = EntityManager.GetBuffer <Level>(levelEntity), levelInfo = levelInfo, cmdBuff = jobCmdBuffer, patternMatchRequest = patternMatchRequest.ToConcurrent(), viewCmdStack = viewCmdStack.ToConcurrent() }; var patternMatching = new PatternMatching() { patternsBufferLookup = GetBufferFromEntity <Pattern>(isReadOnly: true), patternMatchRequest = patternMatchRequest, patternsInfo = patterns, levelBufferLookup = GetBufferFromEntity <Level>(isReadOnly: true), levelInfo = levelInfo, blocksToDelete = blocksToDelete, unswap = unswap.ToConcurrent() }; var performSwap = new PerformSwap() { level = EntityManager.GetBuffer <Level>(levelEntity), levelInfo = levelInfo, unswap = unswap, cmdBuffer = jobCmdBuffer, viewCmdStack = viewCmdStack.ToConcurrent() }; var deleteBlocks = new DeleteBlock() { blocksToDelete = blocksToDelete, levelBufferLookup = GetBufferFromEntity <Level>(isReadOnly: false), levelInfo = levelInfo, cmdBuffer = jobCmdBuffer, viewCmdStack = viewCmdStack.ToConcurrent() }; var moveDownBlocks = new MoveDownBlocks() { levelInfo = levelInfo, levelBufferLookup = GetBufferFromEntity <Level>(isReadOnly: false), viewCmdStack = viewCmdStack.ToConcurrent(), patternMatchRequest = patternMatchRequest.ToConcurrent() }; jobs = swapTestJob.Schedule(this, jobs); jobs = patternMatching.Schedule(jobs); jobs = performSwap.Schedule(this, jobs); jobs = deleteBlocks.Schedule(blocksToDelete.Length, 2, jobs); jobs = moveDownBlocks.Schedule(levelInfo.size.x, 2, jobs); return(jobs); }