I would like to have SFX play when DOTS Physics blocks collide. So far I have an event for each collision-enter, but I don’t know how to play the audio from an ECS system. In the GIF below, you can see that each collision-enter event generates a console message:

Here is the code:
using System;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
[Serializable][GenerateAuthoringComponent]
public struct BlockComponentData : IComponentData
{
public double hitTime;
public float impulse;
public float3 position;
public bool justEnteredCollision;
}
using UnityEngine;
using Unity.Entities;
using Unity.Jobs;
using Unity.Physics;
using Unity.Physics.Systems;
using Unity.Mathematics;
using Unity.Burst;
using Unity.Collections;
public class ColliderEffectsSystem : JobComponentSystem {
private BuildPhysicsWorld buildPhysicsWorld;
private StepPhysicsWorld stepPhysicsWorld;
[BurstCompile]
[UpdateAfter(typeof(EndFramePhysicsSystem))]
private struct CollisionJob : ICollisionEventsJob {
[ReadOnly]
public PhysicsWorld physicsWorld;
[ReadOnly]
public double hitTime;
[ReadOnly]
public float minImpulseForEffect; // seconds
[ReadOnly]
public float minRecollideTime; // seconds
public ComponentDataFromEntity<BlockComponentData> blockComponentEntities;
// EXECUTE
public void Execute(CollisionEvent collisionEvent) {
CollisionEvent.Details d = collisionEvent.CalculateDetails(ref physicsWorld);
Entity entityA = collisionEvent.EntityA;
Entity entityB = collisionEvent.EntityB;
if (d.EstimatedImpulse > minImpulseForEffect)
{
if (blockComponentEntities.HasComponent(entityA))
ProcessCollisionEntity(entityA, d);
else if (blockComponentEntities.HasComponent(entityB))
ProcessCollisionEntity(entityB, d);
}
}
// PROCESS COLLISION OF ENTITY
private void ProcessCollisionEntity(Entity entity, CollisionEvent.Details d)
{
if (blockComponentEntities.HasComponent(entity))
{
BlockComponentData blockData = blockComponentEntities[entity];
double timeSinceLastCollision = hitTime - blockData.hitTime;
blockData.hitTime = hitTime;
if (d.EstimatedImpulse > 1 && timeSinceLastCollision > minRecollideTime)
{
blockData.justEnteredCollision = true;
blockData.impulse = d.EstimatedImpulse;
blockData.position = d.AverageContactPointPosition;
}
blockComponentEntities[entity] = blockData;
}
}
}
protected override void OnCreate() {
buildPhysicsWorld = World.GetOrCreateSystem<BuildPhysicsWorld>();
stepPhysicsWorld = World.GetOrCreateSystem<StepPhysicsWorld>();
}
protected override JobHandle OnUpdate(JobHandle inputDeps) {
CollisionJob collisionJob = new CollisionJob {
blockComponentEntities = GetComponentDataFromEntity<BlockComponentData>(),
physicsWorld = buildPhysicsWorld.PhysicsWorld,
hitTime = Time.ElapsedTime,
minImpulseForEffect = 1.0f,
minRecollideTime = 0.2f
};
return collisionJob.Schedule(stepPhysicsWorld.Simulation, ref buildPhysicsWorld.PhysicsWorld, inputDeps);
}
}
[UpdateAfter(typeof(BuildPhysicsWorld))]
public class ProcessCollisionsSystem : ComponentSystem
{
protected override void OnUpdate()
{
Entities.ForEach((Entity entity, ref BlockComponentData bcd) =>
{
if (bcd.justEnteredCollision)
{
Debug.Log("JUST ENTERED COLLISION - PLAY AUDIO at: " + bcd.position);
bcd.justEnteredCollision = false;
}
});
}
}
Am I on the right track here? How can I play a short AudioClip where that Debug.Log message is?
Thanks in advance!