InvalidOperationException: Structural changes are not allowed while iterating over entities. Please use EntityCommandBuffer instead

  • A* version: [A Pathfinding Project Pro 5.3.3]
  • Unity version: [2022.3.25f1]
    When I try to delete or disable objects with FollowerEntity components in BD, errors occur, including ‘canMove=false’
    public override TaskStatus OnUpdate()
    {
        if (target.Value != null)
        {
            gameObject.GetComponent<AIDestinationSetter>().target = target.Value.transform;
            gameObject.GetComponent<FollowerEntity>().maxSpeed = MoveSpeed.Value + 1f;

            var dis = Vector3.Distance(gameObject.transform.position, target.Value.transform.position);
            if (dis <= 1f)
            {
                gameObject.GetComponent<FollowerEntity>().canMove = false;
                //gameObject.GetComponent<FollowerEntity>().enabled = false;
                //gameObject.GetComponent<AIDestinationSetter>().enabled = false;
                //gameObject.SetActive(false);
            }
        }
        else
            gameObject.GetComponent<FollowerEntity>().maxSpeed = 0;

        return TaskStatus.Running;
    }
InvalidOperationException: Structural changes are not allowed while iterating over entities. Please use EntityCommandBuffer instead.
Unity.Entities.EntityDataAccess.CheckIsStructuralChange () (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/EntityDataAccess.cs:336)
Unity.Entities.EntityDataAccess.BeforeStructuralChange () (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/EntityDataAccess.cs:410)
Unity.Entities.EntityDataAccess.BeginStructuralChanges () (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/EntityDataAccess.cs:420)
Unity.Entities.EntityManager.DestroyEntityInternal (Unity.Entities.Entity* entities, System.Int32 count) (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/EntityManager.cs:5001)
Unity.Entities.EntityManager.DestroyEntity (Unity.Entities.Entity entity) (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/EntityManager.cs:3475)
Pathfinding.FollowerEntity.OnDisable () (at Assets/Plugins/com.arongranberg.astar/Core/AI/FollowerEntity.cs:494)
UnityEngine.GameObject:SetActive(GameObject, Boolean)
SoldierTeamItem_Seek:OnUpdate() (at Assets/Scripts/BehaviorScripts/SoldierTeamItem/SoldierTeamItem_Seek.cs:38)
Opsive.BehaviorDesigner.Runtime.Tasks.StackedTask:OnUpdate() (at ./Packages/com.opsive.behaviordesigner/Runtime/Tasks/StackedTask.cs:231)
Opsive.BehaviorDesigner.Runtime.Systems.TaskObjectSystem:OnUpdate(SystemState&) (at ./Packages/com.opsive.behaviordesigner/Runtime/Systems/TaskObjectSystem.cs:97)
Opsive.BehaviorDesigner.Runtime.Systems.TaskObjectSystem:__codegen__OnUpdate(IntPtr, IntPtr)
Unity.Entities.<>c__DisplayClass9_0:<SelectBurstFn>b__0(IntPtr, IntPtr) (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/SystemBaseRegistry.cs:249)
Unity.Entities.UnmanagedUpdate_0000167D$BurstDirectCall:wrapper_native_indirect_000001923BE13590(IntPtr&, Void*)
Unity.Entities.UnmanagedUpdate_0000167D$BurstDirectCall:Invoke(Void*)
Unity.Entities.WorldUnmanagedImpl:UnmanagedUpdate(Void*) (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/WorldUnmanaged.cs:825)
Unity.Entities.WorldUnmanagedImpl:UpdateSystem(SystemHandle) (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/WorldUnmanaged.cs:891)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:717)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:681)
Opsive.BehaviorDesigner.Runtime.Groups.TraversalTaskSystemGroup:OnUpdate() (at ./Packages/com.opsive.behaviordesigner/Runtime/Groups/TaskSystemGroup.cs:33)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/SystemBase.cs:418)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:723)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:681)
Opsive.BehaviorDesigner.Runtime.Groups.TraversalSystemGroup:OnUpdate() (at ./Packages/com.opsive.behaviordesigner/Runtime/Groups/TraversalSystemGroup.cs:43)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/SystemBase.cs:418)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:723)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:681)
Opsive.BehaviorDesigner.Runtime.Groups.BehaviorTreeSystemGroup:OnUpdate() (at ./Packages/com.opsive.behaviordesigner/Runtime/Groups/BehaviorTreeSystemGroup.cs:59)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/SystemBase.cs:418)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:723)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ComponentSystemGroup.cs:681)
Unity.Entities.SystemBase:Update() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/SystemBase.cs:418)
Unity.Entities.DummyDelegateWrapper:TriggerUpdate() (at ./Library/PackageCache/com.unity.entities@1.3.10/Unity.Entities/ScriptBehaviourUpdateOrder.cs:523)

It looks like behavior designer is using ECS to run its tasks. However, disabling the FollowerEntity will delete its underlying entity. This can, as the error message says, not be done while iterating over entities (done by behavior designer), due to the safety systems that unity has.

I don’t know of a great way to solve this. Perhaps you could queue the deactivation of the FollowerEntity until later in the frame?