Last active
April 22, 2023 16:52
-
-
Save nicloay/3524c60011ff60d6c097a8c6d041b7d9 to your computer and use it in GitHub Desktop.
trigger enter monitor system
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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