#Simple ITriggerEventsJob

1 messages · Page 1 of 1 (latest)

calm saffron
#

Hello,
I'm new to DOTS and wanted to experiment with a simple trigger ESC that would increment a number on a component when 1 entity that holds the component is triggered by another component of a different type.

[BurstCompile]
    public struct TestTriggerJob : ITriggerEventsJob
    {
        [ReadOnly] public ComponentLookup<TriggerableComponent> Triggerable;
        [ReadOnly] public ComponentLookup<TargetComponent> Targets;

        public EntityCommandBuffer ECB;

        [BurstCompile]
        public void Execute(TriggerEvent triggerEvent)
        {
            Entity Triggerable = Entity.Null;
            Entity Target = Entity.Null;

            if(TriggerableComponent.HasComponent(triggerEvent.EntityA)) Triggerable = triggerEvent.EntityA;
            if(TriggerableComponent.HasComponent(triggerEvent.EntityB)) Triggerable = triggerEvent.EntityB;
            if(TargetComponent.HasComponent(triggerEvent.EntityA)) Target = triggerEvent.EntityA;
            if(TargetComponent.HasComponent(triggerEvent.EntityB)) Target = triggerEvent.EntityB;

            if(Triggerable == Entity.Null || Target == Entity.Null) return;

            Debug.Log("Triggered");

            TriggerableComponent triggerable = Triggerable[Triggerable];
            TargetComponent targetComponent = Targets[Target];

            targetComponent.Value += triggerable.Value;
            
            Targets[Target] = targetComponent;

            ECB.DestroyEntity(Triggerable);


        }

    }

Is there anything I could be missing that is obvious to someone who has been working with this API for longer than I have?

#

This is how I am calling the job in case that is important:

 public partial class TriggerTestSystem : SystemBase
    {
        protected override void OnUpdate()
        {


            SimulationSingleton simulation = SystemAPI.GetSingleton<SimulationSingleton>();

            ComponentLookup<TriggerableComponent> triggerable = GetComponentLookup<TriggerableComponent>(true);
            ComponentLookup<TargetComponent> targets = GetComponentLookup<TargetComponent>(true);

            EntityCommandBuffer ecb = new EntityCommandBuffer(Allocator.TempJob);

            TestTriggerJobjob = new TestTriggerJob
            {
                Triggerable = triggerable,
                Targets = targets,
                ECB = ecb
            };

            Dependency = job.Schedule(simulation, Dependency);
            Dependency.Complete();

            ecb.Playback(EntityManager);
            ecb.Dispose();


        }
    }
mental scaffold
#

I'm super new to dots too but it looks like you're trying to write to your read-only collection

calm saffron
#

The trouble is that it doesn't log "triggered"

calm saffron
#

So the same code from yesterday, works without me changing anything

#

I realised what I changed, in case anyone else is having issues:

ComponentLookup<TargetComponent> targets = GetComponentLookup<TargetComponent>(true);
#

That argument in the GetComponentLookup is ReadOnly, basically returning a read only container