protected override JobHandle OnUpdate(JobHandle inputDeps) { triggerEntitiesIndex[0] = 0; GetTriggerEventCount triggerEventCount = new GetTriggerEventCount() { pCounter = triggerEntitiesIndex, enemyEntitiesGroup = enemyGroup.ToEntityArray(Allocator.TempJob), barrierEntitiesGroup = barrierGroup.ToEntityArray(Allocator.TempJob) }; JobHandle jobHandleCount = triggerEventCount.Schedule(stepPhysicsWorld.Simulation, ref buildPhysicsWorld.PhysicsWorld, inputDeps); jobHandleCount.Complete(); var triggerEntities = new NativeArray <Entity>(triggerEntitiesIndex[0], Allocator.TempJob); triggerEntitiesIndex[0] = 0; ListTriggerEventEntitiesJob listTriggerEventEntities = new ListTriggerEventEntitiesJob() { enemyEntitiesGroup = enemyGroup.ToEntityArray(Allocator.TempJob), barrierEntitiesGroup = barrierGroup.ToEntityArray(Allocator.TempJob), toDestroy = triggerEntities, pCounter = triggerEntitiesIndex }; JobHandle listOfEntitiesHandle = listTriggerEventEntities.Schedule(stepPhysicsWorld.Simulation, ref buildPhysicsWorld.PhysicsWorld, inputDeps); listOfEntitiesHandle.Complete(); DestroyEntitiesJob destroyEntities = new DestroyEntitiesJob() { toDestroy = triggerEntities, commandBuffer = endSimulationEntityCommandBuffer.CreateCommandBuffer() }; JobHandle destroyEntitiesHandle = destroyEntities.Schedule(inputDeps); endSimulationEntityCommandBuffer.AddJobHandleForProducer(destroyEntitiesHandle); return(destroyEntitiesHandle); }
protected override JobHandle OnUpdate(JobHandle inputDeps) { JobHandle jobHandle; // Increment the frame count on all active TriggerVolume components JobHandle updateVolumesJobHandle = new UpdateTriggerVolumesJob().Schedule(this, inputDeps); // Get the number of TriggerEvents so that we can allocate a native array m_TriggerEntitiesIndex[0] = 0; JobHandle getTriggerEventCountJobHandle = new GetTriggerEventCount() { pCounter = m_TriggerEntitiesIndex, }.Schedule(m_StepPhysicsWorldSystem.Simulation, ref m_BuildPhysicsWorldSystem.PhysicsWorld, inputDeps); getTriggerEventCountJobHandle.Complete(); // Get the list of overlapping bodies var triggerEntities = new NativeArray <TriggerEntities>(m_TriggerEntitiesIndex[0], Allocator.TempJob); m_TriggerEntitiesIndex[0] = 0; JobHandle listTriggerEventEntitiesJobHandle = new ListTriggerEventEntitiesJob { PhysicsVelocityGroup = GetComponentDataFromEntity <PhysicsVelocity>(true), VolumeGroup = GetComponentDataFromEntity <TriggerVolume>(true), TriggerEntities = triggerEntities, pCounter = m_TriggerEntitiesIndex, }.Schedule(m_StepPhysicsWorldSystem.Simulation, ref m_BuildPhysicsWorldSystem.PhysicsWorld, updateVolumesJobHandle); // Increment the frame count on the OverlappingTriggerVolume components // that are still present in the TriggerEvent list var overlappingGroup = GetComponentDataFromEntity <OverlappingTriggerVolume>(); JobHandle updateOverlappingJobHandle = new UpdateOverlappingJob { TriggerEntites = triggerEntities, TriggerEntitiesCount = m_TriggerEntitiesIndex, OverlappingGroup = overlappingGroup, }.Schedule(listTriggerEventEntitiesJobHandle); // Add OverlappingTriggerVolume components to any Entity that has // just entered a trigger volume var triggerGroup = GetComponentDataFromEntity <TriggerVolume>(true); JobHandle addNewJobHandle = new AddNewOverlappingJob { CommandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer(), TriggerEntities = triggerEntities, TriggerEntitiesCount = m_TriggerEntitiesIndex, TriggerGroup = triggerGroup, OverlappingGroup = overlappingGroup, }.Schedule(updateOverlappingJobHandle); m_EntityCommandBufferSystem.AddJobHandleForProducer(addNewJobHandle); // Remove the OverlappingTriggerVolume component from any Entity // that did not have its frame count incremented and so will be behind // the frame count of the associated trigger. i.e. it has left the trigger volume JobHandle removeOldJobHandle = new RemoveOldOverlappingJob { CommandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer(), OverlappingEntities = OverlappingGroup.ToEntityArray(Allocator.TempJob), TriggerGroup = triggerGroup, OverlappingGroup = overlappingGroup, }.Schedule(updateOverlappingJobHandle); m_EntityCommandBufferSystem.AddJobHandleForProducer(removeOldJobHandle); jobHandle = JobHandle.CombineDependencies(addNewJobHandle, removeOldJobHandle); return(jobHandle); }
protected override void OnUpdate() { // Get the number of TriggerEvents so that we can allocate a native array m_TriggerEntitiesIndex[0] = 0; JobHandle getTriggerEventCountJobHandle = new GetTriggerEventCount { NumTriggerEvents = m_TriggerEntitiesIndex, }.Schedule(m_StepPhysicsWorldSystem.Simulation, ref m_BuildPhysicsWorldSystem.PhysicsWorld, Dependency); getTriggerEventCountJobHandle.Complete(); // Increment the frame count for all TriggerVolumes // This frame count is compared with the overlapping entity frame count so that we can tell if an entity has left the volume. JobHandle updateVolumesJobHandle = Entities .WithName("UpdateTriggerVolumeFrameCounts") .WithBurst() .ForEach((ref TriggerVolume triggerVolume) => triggerVolume.CurrentFrame++).ScheduleParallel(Dependency); // Get the list of overlapping bodies var triggerEntities = new NativeArray <TriggerEntities>(m_TriggerEntitiesIndex[0], Allocator.TempJob); m_TriggerEntitiesIndex[0] = 0; JobHandle listTriggerEventEntitiesJobHandle = new ListTriggerEventEntitiesJob { PhysicsVelocityGroup = GetComponentDataFromEntity <PhysicsVelocity>(true), VolumeGroup = GetComponentDataFromEntity <TriggerVolume>(true), TriggerEntities = triggerEntities, NumTriggerEntities = m_TriggerEntitiesIndex, }.Schedule(m_StepPhysicsWorldSystem.Simulation, ref m_BuildPhysicsWorldSystem.PhysicsWorld, updateVolumesJobHandle); // Increment the frame count on the OverlappingTriggerVolume components // that are still present in the TriggerEvent list var overlappingGroup = GetComponentDataFromEntity <OverlappingTriggerVolume>(); JobHandle updateOverlappingJobHandle = new UpdateOverlappingJob { TriggerEntites = triggerEntities, TriggerEntitiesCount = m_TriggerEntitiesIndex, OverlappingGroup = overlappingGroup, }.Schedule(listTriggerEventEntitiesJobHandle); // Add OverlappingTriggerVolume components to any Entity that has // just entered a trigger volume var triggerGroup = GetComponentDataFromEntity <TriggerVolume>(true); JobHandle addNewJobHandle = new AddNewOverlappingJob { CommandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer(), TriggerEntities = triggerEntities, TriggerEntitiesCount = m_TriggerEntitiesIndex, TriggerGroup = triggerGroup, OverlappingGroup = overlappingGroup, }.Schedule(updateOverlappingJobHandle); m_EntityCommandBufferSystem.AddJobHandleForProducer(addNewJobHandle); // Remove the OverlappingTriggerVolume component from any Entity // that did not have its frame count incremented and so will be behind // the frame count of the associated trigger. i.e. it has left the trigger volume JobHandle removeOldJobHandle = new RemoveOldOverlappingJob { CommandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer(), OverlappingEntities = OverlappingGroup.ToEntityArray(Allocator.TempJob), TriggerGroup = triggerGroup, OverlappingGroup = overlappingGroup, }.Schedule(updateOverlappingJobHandle); m_EntityCommandBufferSystem.AddJobHandleForProducer(removeOldJobHandle); Dependency = JobHandle.CombineDependencies(addNewJobHandle, removeOldJobHandle); }