protected override void OnUpdate() { HavokTriggerEvents triggerEvents = ((HavokSimulation)stepPhysicsWorld.Simulation).TriggerEvents; var amunitionComponents = GetComponentDataFromEntity <AmmunitionComponent>(true); NativeList <Entity> ammunitions = new NativeList <Entity>(Allocator.Temp); foreach (var triggerEvent in triggerEvents) { if (amunitionComponents.HasComponent(triggerEvent.Entities.EntityA)) { if (!ammunitions.Contains(triggerEvent.Entities.EntityA)) { ammunitions.Add(triggerEvent.Entities.EntityA); } } if (amunitionComponents.HasComponent(triggerEvent.Entities.EntityB)) { if (!ammunitions.Contains(triggerEvent.Entities.EntityB)) { ammunitions.Add(triggerEvent.Entities.EntityB); } } } foreach (var entity in ammunitions) { AmmunitionComponent ac = EntityManager.GetComponentData <AmmunitionComponent>(entity); EntityManager.DestroyEntity(entity); gunComponent = EntityManager.GetComponentData <GunComponent>(GameVariables.Player.PlayerWeaponEntities[ac.TypeAmmunition]); gunComponent.CurrentAmountBulletOnPlayer = math.clamp(gunComponent.CurrentAmountBulletOnPlayer + ac.AmmunitionQuantity, 0, gunComponent.MaxBulletOnPlayer); EntityManager.SetComponentData(GameVariables.Player.PlayerWeaponEntities[ac.TypeAmmunition], gunComponent); SoundEventSystem.PlayPickupSound(DropType.AmmunitionShotgun); UIManager.RefreshBulletsText(); //TODO Play VFX } ammunitions.Dispose(); }
//Will be slow if lots of TriggerEvent (Change to parallel) protected override void OnUpdate() { //Get Collision Events HavokTriggerEvents triggerEvents = ((HavokSimulation)stepPhysicsWorld.Simulation).TriggerEvents; //Get all Interactable Entities ComponentDataFromEntity <InteractableComponent> interactables = GetComponentDataFromEntity <InteractableComponent>(true); ComponentDataFromEntity <Translation> interactablePositions = GetComponentDataFromEntity <Translation>(true); ComponentDataFromEntity <Rotation> interactableRotations = GetComponentDataFromEntity <Rotation>(true); HashSet <CollisionLink> currentFrameCollisions = new HashSet <CollisionLink>(); //Retrieve all interactables collision with PlayerEntity foreach (TriggerEvent triggerEvent in triggerEvents) { if (interactables.Exists(triggerEvent.Entities.EntityA)) { currentFrameCollisions.Add(new CollisionLink { TriggerEntity = triggerEvent.Entities.EntityA, NotTriggerEntity = triggerEvent.Entities.EntityB }); } else if (interactables.Exists(triggerEvent.Entities.EntityB)) { currentFrameCollisions.Add(new CollisionLink { TriggerEntity = triggerEvent.Entities.EntityB, NotTriggerEntity = triggerEvent.Entities.EntityA }); } } foreach (CollisionLink link in currentFrameCollisions) { //if interactable was not already colliding previous frame -> OnTriggerEnter if (!PreviousFrameCollisions.Contains(link)) { //Create Event EventsHolder.InteractableEvents.Add(new InteractableInfo { TriggerEntity = link.TriggerEntity, CollidedEntity = link.NotTriggerEntity, Position = interactablePositions[link.TriggerEntity].Value, Rotation = interactableRotations[link.TriggerEntity].Value, InteractableType = interactables[link.TriggerEntity].Type, ObjectType = interactables[link.TriggerEntity].ObjectType, CollisionType = InteractableInfo.InteractableCollisionType.OnTriggerEnter }); } } foreach (CollisionLink link in PreviousFrameCollisions) { if (EntityManager.Exists(link.TriggerEntity)) { //if previous collision not detected this frame -> OnTriggerExit if (!currentFrameCollisions.Contains(link)) { //Create Event EventsHolder.InteractableEvents.Add(new InteractableInfo { TriggerEntity = link.TriggerEntity, CollidedEntity = link.NotTriggerEntity, Position = interactablePositions[link.TriggerEntity].Value, Rotation = interactableRotations[link.TriggerEntity].Value, InteractableType = interactables[link.TriggerEntity].Type, ObjectType = interactables[link.TriggerEntity].ObjectType, CollisionType = InteractableInfo.InteractableCollisionType.OnTriggerExit }); } } } PreviousFrameCollisions = currentFrameCollisions; }