Search Unity

Resolved ECS collision not rising event

Discussion in 'Physics for ECS' started by devil304, Aug 19, 2021.

  1. devil304

    devil304

    Joined:
    Sep 20, 2013
    Posts:
    11
    I'm trying to do something when two asteroids collide with each other, but this code is not detecting any collision and I don't know why. I also tried JobComponentSystem, same problem, any ideas?
    Code (CSharp):
    1.  [UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]
    2. [UpdateAfter(typeof(EndFramePhysicsSystem))]
    3. public class AsteroidsCollisionEventHandler : SystemBase
    4. {
    5.      [BurstDiscard]
    6.      public static void Log(string message)
    7.      {
    8.          Debug.Log(message);
    9.      }
    10.      [BurstCompile]
    11.      struct AsteroidCollision : ICollisionEventsJob
    12.      {
    13.          [ReadOnly] public ComponentDataFromEntity<AsteroidData> asteroidDataGroup;
    14.          public ComponentDataFromEntity<Translation> translationGroup;
    15.          public void Execute(CollisionEvent collisionEvent)
    16.          {
    17.              Log("Collide");
    18.              if (asteroidDataGroup.HasComponent(collisionEvent.EntityA))
    19.              {
    20.                  Translation t = translationGroup[collisionEvent.EntityA];
    21.                  t.Value = (Vector3)((Vector2)asteroidDataGroup[collisionEvent.EntityA].StartingPos);
    22.              }
    23.              else if (asteroidDataGroup.HasComponent(collisionEvent.EntityB))
    24.              {
    25.                  Translation t = translationGroup[collisionEvent.EntityB];
    26.                  t.Value = (Vector3)((Vector2)asteroidDataGroup[collisionEvent.EntityB].StartingPos);
    27.              }
    28.          }
    29.      }
    30.      BuildPhysicsWorld BPW;
    31.      StepPhysicsWorld SPW;
    32.      protected override void OnCreate()
    33.      {
    34.          BPW = World.GetOrCreateSystem<BuildPhysicsWorld>();
    35.          SPW = World.GetOrCreateSystem<StepPhysicsWorld>();
    36.      }
    37.      protected override void OnUpdate()
    38.      {
    39.          Log("Yes");
    40.          Dependency = new AsteroidCollision {
    41.              asteroidDataGroup = GetComponentDataFromEntity<AsteroidData>(true),
    42.              translationGroup = GetComponentDataFromEntity<Translation>()
    43.          }.Schedule(SPW.Simulation, ref BPW.PhysicsWorld, Dependency);
    44.      }
    45. }
    Asteroid setup:

    They all are colliding with each other:
     
  2. Arnold_2013

    Arnold_2013

    Joined:
    Nov 24, 2013
    Posts:
    285
    Looks good.

    Is the CollisionFilter set to BelongsTo Everything, Collides With Everything? (or both 'astroidFilter' or something)

    You could try forcing a Complete(). To see if this results in the job running.

    Dependency = new AsteroidCollision {
    asteroidDataGroup = GetComponentDataFromEntity<AsteroidData>(true),
    translationGroup = GetComponentDataFromEntity<Translation>()
    }.Schedule(SPW.Simulation, ref BPW.PhysicsWorld, Dependency).Complete();
     
  3. devil304

    devil304

    Joined:
    Sep 20, 2013
    Posts:
    11
    Belongs To and Collide With are set to Everything. You can't just add .Complete() to the end because Complete() return void and Dependency require JobHandle to be returned. I added Dependency.Complete(); after that but still no luck.
     
  4. devil304

    devil304

    Joined:
    Sep 20, 2013
    Posts:
    11
    I was just stupid. I forgot to set a new translation after modification and "Log" method didn't work there because it's BurstCompiled and that method has attribute BurstDiscard.