Skip to content

Instantly share code, notes, and snippets.

@nicloay
Last active April 22, 2023 16:52
Show Gist options
  • Save nicloay/3524c60011ff60d6c097a8c6d041b7d9 to your computer and use it in GitHub Desktop.
Save nicloay/3524c60011ff60d6c097a8c6d041b7d9 to your computer and use it in GitHub Desktop.
trigger enter monitor system
using CyberSnake.ECS.Authoring;
using CyberSnake.ECS.ComponentData;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Physics;
namespace CyberSnake.ECS.Systems
{
[UpdateInGroup(typeof(FixedStepSimulationSystemGroup))]
[BurstCompile]
public partial struct DamageOnTriggerEnterSystem : ISystem
{
private ComponentLookup<DamageOnTriggerEnter> _damageGiver;
private ComponentLookup<MaxHealth> _damageReceiver;
[BurstCompile]
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<BeginSimulationEntityCommandBufferSystem.Singleton>();
state.RequireForUpdate<SimulationSingleton>();
state.RequireForUpdate<DamageOnTriggerEnter>();
_damageGiver = state.GetComponentLookup<DamageOnTriggerEnter>(true);
_damageReceiver = state.GetComponentLookup<MaxHealth>(true);
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
_damageReceiver.Update(ref state);
_damageGiver.Update(ref state);
var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();
var ecb = ecbSingleton.CreateCommandBuffer(state.WorldUnmanaged);
var simulationSingleton = SystemAPI.GetSingleton<SimulationSingleton>();
var jobHandle = new ApplyDamageJob
{
CommandBuffer = ecb,
DamageGiver = _damageGiver,
DamageReceiver = _damageReceiver
}.Schedule(simulationSingleton, state.Dependency);
jobHandle.Complete();
}
[BurstCompile]
public struct ApplyDamageJob : ITriggerEventsJob
{
[ReadOnly] public ComponentLookup<DamageOnTriggerEnter> DamageGiver;
[ReadOnly] public ComponentLookup<MaxHealth> DamageReceiver;
public EntityCommandBuffer CommandBuffer;
[BurstCompile]
public void Execute(TriggerEvent triggerEvent)
{
var entityA = triggerEvent.EntityA;
var entityB = triggerEvent.EntityB;
DamageOnTriggerEnter giver;
if (DamageGiver.TryGetComponent(entityA, out giver) && DamageReceiver.HasComponent(entityB))
{
CommandBuffer.AddComponent(entityB, new ComponentData.Damage { Value = giver.Damage });
CommandBuffer.AddComponent(entityA, new TriggerEnteredTag());
}
if (DamageGiver.TryGetComponent(entityB, out giver) && DamageReceiver.HasComponent(entityA))
{
CommandBuffer.AddComponent(entityA, new ComponentData.Damage { Value = giver.Damage });
CommandBuffer.AddComponent(entityB, new TriggerEnteredTag());
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment