Search Unity

Question Raycast schedule for each system

Discussion in 'Entity Component System' started by andruplay, Sep 15, 2021.

  1. andruplay

    andruplay

    Joined:
    Dec 30, 2019
    Posts:
    5
    I had problem witch Racasts.
    If i try run code bolow i get this error:
    InvalidOperationException: The Unity.Collections.NativeArray`1[Unity.Physics.RigidBody] OnUpdate_LambdaJob0.JobData.collisionWorld.m_Bodies has been deallocated. All containers must be valid when scheduling a job.
    Unity.Entities.JobChunkExtensions.FinalizeScheduleChecked (System.Boolean isParallel, System.Int32 unfilteredChunkCount, Unity.Jobs.JobHandle prefilterHandle, Unity.Collections.NativeArray`1[T] prefilterData, System.Void* deferredCountData, System.Boolean useFiltering, Unity.Jobs.LowLevel.Unsafe.JobsUtility+JobScheduleParameters& scheduleParams, System.Boolean& executed, Unity.Jobs.JobHandle& result)

    If i change foreach from schedule to run i get this error:
    ObjectDisposedException: The Unity.Collections.NativeArray`1[Unity.Physics.BoundingVolumeHierarchy+Node] has been deallocated, it is not allowed to access it
    I knew that debug.drawLine work correctly but then code crasch and dont know how to repair it.
    Code (CSharp):
    1. using Unity.Entities;
    2. using Unity.Mathematics;
    3. using Unity.Physics;
    4. using Unity.Physics.Systems;
    5. using Unity.Transforms;
    6. using UnityEngine;
    7. using Unity.Collections;
    8. [AlwaysUpdateSystem]
    9. [UpdateBefore(typeof(MovSystemForwarder))]
    10. [AlwaysSynchronizeSystem]
    11. public class RaycastSystem : SystemBase
    12. {
    13.     private BuildPhysicsWorld _buildPhysicsWorld;
    14.     private CollisionWorld _collisionWorld;
    15.     private RaycastInput _raycastInput;
    16.     private float3 fromPosition, toposition;
    17.     private float _rayDistance=1f;
    18.     private EndFixedStepSimulationEntityCommandBufferSystem _commandBuffer;
    19.     protected override void OnCreate()
    20.     {
    21.         _commandBuffer = World.DefaultGameObjectInjectionWorld.GetExistingSystem<EndFixedStepSimulationEntityCommandBufferSystem>();
    22.         _buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
    23.         _collisionWorld = _buildPhysicsWorld.PhysicsWorld.CollisionWorld;
    24.         _raycastInput = new RaycastInput
    25.         {
    26.             Start = fromPosition,
    27.             End = toposition,
    28.             Filter = CollisionFilter.Default
    29.         };
    30.  
    31.     }
    32.  
    33.     protected override void OnUpdate()
    34.     {
    35.             ComponentDataFromEntity<ActiveCubeTag> _cubeDetect = this.GetComponentDataFromEntity<ActiveCubeTag>();
    36.         Unity.Physics.RaycastHit  hitarray = new Unity.Physics.RaycastHit();
    37.             float rayDistance = _rayDistance;
    38.         RaycastInput raycastInput = _raycastInput;
    39.         CollisionWorld collisionWorld = _collisionWorld;
    40.         PhysicsWorld buildPhysicsWorld = _buildPhysicsWorld.PhysicsWorld;
    41.  
    42.             Entities
    43.             .WithAll<BlockMovementTag>()
    44.             .ForEach(( in LocalToWorld trans) =>
    45.             {
    46.                 Unity.Physics.RaycastHit raycastHit = hitarray;
    47.                 raycastInput.Start = trans.Position;
    48.                 //go x right
    49.                 raycastInput.End = trans.Position + new float3(rayDistance, 0, 0);
    50.                 Debug.DrawLine(raycastInput.Start, raycastInput.End, Color.green);
    51.                 if (collisionWorld.CastRay(raycastInput, out raycastHit))
    52.                 {
    53.                     Debug.Log("test2");
    54.                    
    55.                     Entity hitEntity = buildPhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
    56.                     if(_cubeDetect.HasComponent(hitEntity))
    57.                     {
    58.                         Debug.Log("test");
    59.                     }
    60.                 }
    61.                 //go x left
    62.                 raycastInput.End -= new float3(rayDistance*2, 0, 0);
    63.                 Debug.DrawLine(raycastInput.Start, raycastInput.End, Color.green);
    64.                 if (collisionWorld.CastRay(raycastInput, out raycastHit))
    65.                 {
    66.  
    67.                     Entity hitEntity = buildPhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
    68.                     if (_cubeDetect.HasComponent(hitEntity))
    69.                     {
    70.                         Debug.Log("test");
    71.                     }
    72.                 }
    73.                 //go z right
    74.                 raycastInput.End += new float3(rayDistance, 0, rayDistance);
    75.                 Debug.DrawLine(raycastInput.Start, raycastInput.End, Color.green);
    76.                 if (collisionWorld.CastRay(raycastInput, out raycastHit))
    77.                 {
    78.                     Entity hitEntity = buildPhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
    79.                     if (_cubeDetect.HasComponent(hitEntity))
    80.                     {
    81.                         Debug.Log("test");
    82.                     }
    83.                 }
    84.                 //go z left
    85.                 raycastInput.End -= new float3(0, 0, rayDistance * 2);
    86.                 Debug.DrawLine(raycastInput.Start, raycastInput.End, Color.green);
    87.                 if (collisionWorld.CastRay(raycastInput, out raycastHit))
    88.                 {
    89.                     Entity hitEntity = buildPhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
    90.                     if (_cubeDetect.HasComponent(hitEntity))
    91.                     {
    92.                         Debug.Log("test");
    93.                     }
    94.                 }
    95.  
    96.             }).Schedule(this.Dependency);
    97.         _commandBuffer.AddJobHandleForProducer(this.Dependency);
    98.     }
    99. }
    100.