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);
}
}
}
}