Search Unity

  1. Unity Asset Manager is now available in public beta. Try it out now and join the conversation here in the forums.
    Dismiss Notice

Resolved CastRay in IJobParallelFor Problem (Slice may not be used on a restricted range array)

Discussion in 'Physics Previews' started by JamesPardue, Jan 26, 2021.

  1. JamesPardue

    JamesPardue

    Joined:
    Mar 6, 2020
    Posts:
    6
    I was trying to have parallel jobs that use the CastRay function. While doing so I got an error that read "Slice may not be used on a restricted range array".

    I'm not sure if I'm using the interface wrong.

    Here is the Code that is causing the issue:
    Code (CSharp):
    1.  
    2. using UnityEngine;
    3. using Unity.Entities;
    4. using Unity.Mathematics;
    5. using Unity.Physics;
    6. using Unity.Physics.Systems;
    7. using Unity.Collections;
    8. using Unity.Jobs;
    9.  
    10. public class RayCastTest : MonoBehaviour
    11. {
    12.  
    13.     static RayCaster rayCaster;
    14.  
    15.     void Start()
    16.     {
    17.         rayCaster = new RayCaster();
    18.     }
    19.  
    20.     public struct RayCastJob : IJobParallelFor
    21.     {
    22.         public float3 from;
    23.         public float3 to;
    24.         public CollisionWorld collisionWorld;
    25.  
    26.         public void Execute(int index)
    27.         {
    28.             rayCaster.Raycast(from, to, collisionWorld);
    29.         }
    30.     }
    31.  
    32.     void Update()
    33.     {
    34.         if (Input.GetMouseButton(0))
    35.         {
    36.             BuildPhysicsWorld buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem<BuildPhysicsWorld>();
    37.             CollisionWorld collisionWorld = buildPhysicsWorld.PhysicsWorld.CollisionWorld;
    38.  
    39.             UnityEngine.Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    40.  
    41.             float rayDistance = 10000f;
    42.  
    43.             RayCastJob job = new RayCastJob();
    44.             job.from = ray.origin;
    45.             job.to = ray.direction * rayDistance;
    46.             job.collisionWorld = collisionWorld;
    47.  
    48.             JobHandle handle = job.Schedule(2, 1);
    49.  
    50.             handle.Complete();
    51.         }
    52.     }
    53. }
    54.  
    Code (CSharp):
    1.  
    2. using UnityEngine;
    3. using Unity.Entities;
    4. using Unity.Mathematics;
    5. using Unity.Physics;
    6.  
    7. public class RayCaster : MonoBehaviour
    8. {
    9.     public void Raycast(float3 fromPosition, float3 toPosition, CollisionWorld collisionWorld)
    10.     {
    11.         Unity.Physics.RaycastInput input = new Unity.Physics.RaycastInput()
    12.         {
    13.             Start = fromPosition,
    14.             End = toPosition,
    15.             Filter = new CollisionFilter()
    16.             {
    17.                 BelongsTo = ~0u,
    18.                 CollidesWith = ~0u,
    19.                 GroupIndex = 0,
    20.             }
    21.         };
    22.  
    23.         Unity.Physics.RaycastHit hit = new Unity.Physics.RaycastHit();
    24.  
    25.         bool haveHit = collisionWorld.CastRay(input, out hit);
    26.  
    27.         if (haveHit)
    28.         {
    29.             Debug.Log("Something was hit...");
    30.         }
    31.         else
    32.             Debug.Log("Nothing hit...");
    33.     }
    34. }
    35.  
    The error is on line
    bool haveHit = collisionWorld.CastRay(input, out hit);

    The error's call stack is:
    Code (CSharp):
    1. ArgumentException: Slice may not be used on a restricted range array
    2. Parameter name: array
    3. Unity.Collections.NativeSlice`1[T]..ctor (Unity.Collections.NativeArray`1[T] array, System.Int32 start, System.Int32 length) (at <82ec470c913149358ad0c83ad628910c>:0)
    4. Unity.Collections.NativeSlice`1[T]..ctor (Unity.Collections.NativeArray`1[T] array) (at <82ec470c913149358ad0c83ad628910c>:0)
    5. Unity.Collections.NativeSlice`1[T].op_Implicit (Unity.Collections.NativeArray`1[T] array) (at <82ec470c913149358ad0c83ad628910c>:0)
    6. Unity.Physics.CollisionWorld.CastRay[T] (Unity.Physics.RaycastInput input, T& collector) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/CollisionWorld.cs:201)
    7. Unity.Physics.QueryWrappers.RayCast[T] (T& target, Unity.Physics.RaycastInput input, Unity.Physics.RaycastHit& closestHit) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/Queries/Collidable.cs:105)
    8. Unity.Physics.CollisionWorld.CastRay (Unity.Physics.RaycastInput input, Unity.Physics.RaycastHit& closestHit) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/CollisionWorld.cs:197)
    9. RayCaster.Raycast (Unity.Mathematics.float3 fromPosition, Unity.Mathematics.float3 toPosition, Unity.Physics.CollisionWorld collisionWorld) (at Assets/RayCaster.cs:29)
    10. RayCastTest+RayCastJob.Execute (System.Int32 index) (at Assets/RayCastTest.cs:29)
    11. Unity.Jobs.IJobParallelForExtensions+ParallelForJobStruct`1[T].Execute (T& jobData, System.IntPtr additionalPtr, System.IntPtr bufferRangePatchData, Unity.Jobs.LowLevel.Unsafe.JobRanges& ranges, System.Int32 jobIndex) (at <82ec470c913149358ad0c83ad628910c>:0)
    Help would be appreciated. Thanks.
     
  2. milos85miki

    milos85miki

    Joined:
    Nov 29, 2019
    Posts:
    197
  3. JamesPardue

    JamesPardue

    Joined:
    Mar 6, 2020
    Posts:
    6
    @milos85miki Seems that was what I was missing. I'm no longer getting the error. Thanks for the help.
     
    AlanMattano likes this.