using Unity.Burst; using Unity.Entities; using Unity.Jobs; using Unity.Physics; using Unity.Physics.Systems; namespace TinyPhysics.Systems { /// /// Detect when a Collideable collides with another entity /// To raise a CollisionEvent the option needs to be checked in the PhysicsShape component /// [UpdateAfter(typeof(EndFramePhysicsSystem))] public class CollisionSystem : SystemBase { private BuildPhysicsWorld buildPhysicsWorldSystem; private StepPhysicsWorld stepPhysicsWorldSystem; protected override void OnCreate() { base.OnCreate(); buildPhysicsWorldSystem = World.GetOrCreateSystem(); stepPhysicsWorldSystem = World.GetOrCreateSystem(); } protected override void OnUpdate() { Dependency = new CollideableJob { CollideableGroup = GetComponentDataFromEntity() }.Schedule(stepPhysicsWorldSystem.Simulation, ref buildPhysicsWorldSystem.PhysicsWorld, Dependency); } [BurstCompile] private struct CollideableJob : ICollisionEventsJob { public ComponentDataFromEntity CollideableGroup; public void UpdateCollideable(Entity entity, Entity collider) { if (CollideableGroup.HasComponent(entity)) { var collideable = CollideableGroup[entity]; collideable.CollisionEntity = collider; CollideableGroup[entity] = collideable; UnityEngine.Debug.Log("Collide"); } } public void Execute(CollisionEvent collisionEvent) { var entityA = collisionEvent.EntityA; var entityB = collisionEvent.EntityB; UpdateCollideable(entityA, entityB); UpdateCollideable(entityB, entityA); } } } }