Search Unity

  1. We are migrating the Unity Forums to Unity Discussions by the end of July. Read our announcement for more information and let us know if you have any questions.
    Dismiss Notice
  2. Dismiss Notice

Question I want to change the component value of the child buffer's entity.

Discussion in 'Entity Component System' started by GeonPang, Dec 11, 2023.

  1. GeonPang

    GeonPang

    Joined:
    Oct 4, 2021
    Posts:
    2
    If A (CollisionEntity) and B (InstanceEntity) collide, write a code that changes the Material Color value of the Entities that exist as a sub-item of InstanceEntity and you are yourself. However, when I write and run that code, I get an error message. I know what's wrong with the code. Or please let me know how to send it from ECS.

    Error Message:
    "ArgumentException: System.ArgumentException: System.String Unity.Entities.EntityComponentStore::AppendRemovedComponentRecordError(Unity.Entities.Entity,Unity.Entities.ComponentType)
    This Exception was thrown from a function compiled with Burst, which has limited exception support.
    0x00007ffcc10b8e20 (968d884ed9caab83139827ecb3b0053)"

    Code:
    [UpdateInGroup(typeof(AfterPhysicsSystemGroup))]
    public partial struct CollisionMaterialChangeSystem : ISystem
    {
    void OnCreate(ref SystemState state)
    {
    state.RequireForUpdate<CollisionEntity>();
    }

    public void OnUpdate(ref SystemState state)
    {
    var ecb = SystemAPI.GetSingleton<EndFixedStepSimulationEntityCommandBufferSystem.Singleton>()
    .CreateCommandBuffer(state.WorldUnmanaged);

    state.Dependency = new CollisionChangeColorJobTEMP
    {
    Ecb = ecb,
    CollisionEntity = SystemAPI.GetComponentLookup<CollisionEntity>(),
    InstanceEntity = SystemAPI.GetComponentLookup<InstanceEntity>(),
    ChildEntity = SystemAPI.GetBufferLookup<Child>(),
    }.Schedule(SystemAPI.GetSingleton<SimulationSingleton>(), state.Dependency);
    }
    }

    public struct CollisionChangeColorJobTEMP : ICollisionEventsJob
    {
    public EntityCommandBuffer Ecb;
    public ComponentLookup<CollisionEntity> CollisionEntity;
    public ComponentLookup<InstanceEntity> InstanceEntity;
    public BufferLookup<Child> ChildEntity;

    public void Execute(CollisionEvent collisionEvent)
    {
    bool isCollisionEntityA = CollisionEntity.HasComponent(collisionEvent.EntityA);
    bool isCollisionEntityB = CollisionEntity.HasComponent(collisionEvent.EntityB);

    bool isInstanceEntityA = InstanceEntity.HasComponent(collisionEvent.EntityA);
    bool isInstanceEntityB = InstanceEntity.HasComponent(collisionEvent.EntityB);

    if (!(isCollisionEntityA ^ isCollisionEntityB)) return;
    if (!(isInstanceEntityA ^ isInstanceEntityB)) return;

    Entity instanceEntity;

    if (isCollisionEntityA)
    {
    instanceEntity = collisionEvent.EntityB;
    }
    else
    {
    instanceEntity = collisionEvent.EntityA;
    }

    if (ChildEntity.HasBuffer(instanceEntity))
    {
    DynamicBuffer<Child> buffer;
    if (ChildEntity.TryGetBuffer(instanceEntity, out buffer))
    {
    foreach (var child in buffer)
    {
    Ecb.SetComponent(child.Value, new URPMaterialPropertyBaseColor { Value = new float4(1, 0, 0, 1) });
    }
    }
    }
    }
    }
     
    Last edited: Dec 11, 2023
    Juvennn likes this.