InvalidOperationException when performing raycast

I get this exception when I perform a raycast:

Exception

InvalidOperationException: The Unity.Collections.NativeArray1[Unity.Physics.BoundingVolumeHierarchy+Node] has been deallocated, it is not allowed to access it Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrowNoEarlyOut (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <c85ab98a3257443eaa6aaaea77733582>:0) Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrow (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <c85ab98a3257443eaa6aaaea77733582>:0) Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafeReadOnlyPtr[T] (Unity.Collections.NativeArray1[T] nativeArray) (at :0)
Unity.Physics.BoundingVolumeHierarchy…ctor (Unity.Collections.NativeArray1[T] nodes, Unity.Collections.NativeArray1[T] nodeFilters) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Collision/Geometry/BoundingVolumeHierarchy.cs:26)
Unity.Physics.Broadphase+Tree.get_BoundingVolumeHierarchy () (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Collision/World/Broadphase.cs:363)
Unity.Physics.Broadphase.CastRay[T] (Unity.Physics.RaycastInput input, Unity.Collections.NativeArray`1[T] rigidBodies, T& collector) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Collision/World/Broadphase.cs:513)
Unity.Physics.CollisionWorld.CastRay[T] (Unity.Physics.RaycastInput input, T& collector) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Collision/World/CollisionWorld.cs:199)
Unity.Physics.PhysicsWorld.CastRay[T] (Unity.Physics.RaycastInput input, T& collector) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Dynamics/World/PhysicsWorld.cs:74)
Unity.Physics.QueryWrappers.RayCast[T] (T& target, Unity.Physics.RaycastInput input) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Collision/Queries/Collidable.cs:99)
Unity.Physics.PhysicsWorld.CastRay (Unity.Physics.RaycastInput input) (at Library/PackageCache/com.unity.physics@0.4.0-preview.5/Unity.Physics/Dynamics/World/PhysicsWorld.cs:69)
Systems.EnemySystem+MovementRayCast.CheckRay (Unity.Mathematics.float3 pos, Unity.Mathematics.float3 dir, Unity.Mathematics.float3 currentDirection) (at Assets/Scripts/Systems/EnemySystem.cs:101)
Systems.EnemySystem+<>c__DisplayClass_OnUpdate_LambdaJob0.OriginalLambdaBody (Movable& movable, Components.Enemy& enemy, Unity.Transforms.Translation& translation) (at Assets/Scripts/Systems/EnemySystem.cs:43)
Systems.EnemySystem+<>c__DisplayClass_OnUpdate_LambdaJob0.IterateEntities (Unity.Entities.ArchetypeChunk& chunk, Systems.EnemySystem+<>c__DisplayClass_OnUpdate_LambdaJob0+LambdaParameterValueProviders+Runtimes& runtimes) (at :0)
Systems.EnemySystem+<>c__DisplayClass_OnUpdate_LambdaJob0.Execute (Unity.Entities.ArchetypeChunk chunk, System.Int32 chunkIndex, System.Int32 firstEntityIndex) (at :0)
Unity.Entities.JobChunkExtensions.RunWithoutJobs[T] (T& jobData, Unity.Entities.ArchetypeChunkIterator& chunkIterator) (at Library/PackageCache/com.unity.entities@0.11.1-preview.4/Unity.Entities/IJobChunk.cs:157)
Systems.EnemySystem+<>c__DisplayClass_OnUpdate_LambdaJob0.RunWithoutJobSystem (Unity.Entities.ArchetypeChunkIterator* archetypeChunkIterator, System.Void* jobData) (at :0)
Unity.Entities.InternalCompilerInterface.RunJobChunk[T] (T& jobData, Unity.Entities.EntityQuery query, Unity.Entities.InternalCompilerInterface+JobChunkRunWithoutJobSystemDelegate functionPointer) (at Library/PackageCache/com.unity.entities@0.11.1-preview.4/Unity.Entities/CodeGeneratedJobForEach/LambdaJobDescription.cs:375)
Systems.EnemySystem.OnUpdate () (at Assets/Scripts/Systems/EnemySystem.cs:36)
Unity.Entities.SystemBase.Update () (at Library/Pa

Do I need to add some dependency to my job?

I have made a simplified version:

public class EnemySystem : SystemBase
{
        private PhysicsWorld _PhysicsWorld;

        private Random random = new Random(22);

        protected override void OnCreate()
        {
            base.OnCreate();
            _PhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>().PhysicsWorld;
        }

        protected override void OnUpdate()
        {
            var rayCaster = new MovementRayCast
            {
                PhysicsWorld = _PhysicsWorld
            };
            random.NextInt();
            var rand = random;
            var frame = UnityEngine.Time.frameCount;
            Entities.ForEach((ref Movable movable, ref Enemy enemy, in Translation translation) =>
            {
                var ray = new RaycastInput
                {
                    Start = translation.Value,
                    End = translation.Value + movable.direction * 0.9f,
                    Filter = CollisionFilter.Default
                    /*new CollisionFilter
                    {
                        GroupIndex = 0,
                        BelongsTo = 1u << 1,
                        CollidesWith = 1u << 2
                    }*/
                };
                Debug.Log($"WallAhead {rayCaster.PhysicsWorld.CastRay(ray)}");
           }).WithoutBurst().Run();
        }

    private struct MovementRayCast
    {
        [ReadOnly] public PhysicsWorld PhysicsWorld;
    }
 }

I have found an issue can be closed.

1 Like