コード例 #1
0
        public void Execute()
        {
            var collector = new IgnoreTransparentClosestHitCollector(World);

            World.CastRay(RaycastInput, ref collector);
            Hit[0] = collector.ClosestHit;
        }
    protected override void OnUpdate()
    {
        CollisionWorld      collisionWorld = m_BuildPhysicsWorld.PhysicsWorld.CollisionWorld;
        EntityCommandBuffer commandBuffer  = m_EntityCommandBufferSystem.CreateCommandBuffer();

        Dependency = JobHandle.CombineDependencies(Dependency, m_EndFramePhysicsSystem.FinalJobHandle);

        Entities
        .WithName("RaycastWithCustomCollector")
        .WithBurst()
        .ForEach((Entity entity, ref Translation position, ref Rotation rotation, ref VisualizedRaycast visualizedRaycast) =>
        {
            var raycastLength = visualizedRaycast.RayLength;

            // Perform the Raycast
            var raycastInput = new RaycastInput
            {
                Start  = position.Value,
                End    = position.Value + (math.forward(rotation.Value) * visualizedRaycast.RayLength),
                Filter = CollisionFilter.Default
            };

            var collector = new IgnoreTransparentClosestHitCollector(collisionWorld);

            collisionWorld.CastRay(raycastInput, ref collector);

            var hit         = collector.ClosestHit;
            var hitDistance = raycastLength * hit.Fraction;

            // position the entities and scale based on the ray length and hit distance
            // visualization elements are scaled along the z-axis aka math.forward
            var newFullRayPosition = new float3(0, 0, raycastLength * 0.5f);
            var newFullRayScale    = new float3(1f, 1f, raycastLength);
            var newHitPosition     = new float3(0, 0, hitDistance);
            var newHitRayPosition  = new float3(0, 0, hitDistance * 0.5f);
            var newHitRayScale     = new float3(1f, 1f, raycastLength * hit.Fraction);

            commandBuffer.SetComponent(visualizedRaycast.HitPositionEntity, new Translation {
                Value = newHitPosition
            });
            commandBuffer.SetComponent(visualizedRaycast.HitRayEntity, new Translation {
                Value = newHitRayPosition
            });
            commandBuffer.SetComponent(visualizedRaycast.HitRayEntity, new NonUniformScale {
                Value = newHitRayScale
            });
            commandBuffer.SetComponent(visualizedRaycast.FullRayEntity, new Translation {
                Value = newFullRayPosition
            });
            commandBuffer.SetComponent(visualizedRaycast.FullRayEntity, new NonUniformScale {
                Value = newFullRayScale
            });
        }).Schedule();

        m_EntityCommandBufferSystem.AddJobHandleForProducer(Dependency);
    }
コード例 #3
0
        protected override void OnUpdate( )
        {
            int i_pathPlannerCount = group_pathPlanners.CalculateEntityCount();

            if (i_pathPlannerCount == 0)
            {
                return;
            }

            CollisionWorld collisionWorld = buildPhysicsWorld.PhysicsWorld.CollisionWorld;



            float3 f_pointerPosition = Input.mousePosition;

            UnityEngine.Ray pointerRay = Camera.main.ScreenPointToRay(f_pointerPosition);

            Debug.DrawLine(pointerRay.origin, pointerRay.origin + pointerRay.direction * 200, Color.blue);


            CollisionFilter collisionFilter = default;

            collisionFilter.CollidesWith = 1 << (int)CollisionFilters.ElevationNodes;      // Elevation Nodes.
            // collisionFilter.CollidesWith += 1 << (int) CollisionFilters.Floor ; // Floor.
            // collisionFilter.CollidesWith += 1 << (int) CollisionFilters.Walls ; // Walls.
            // collisionFilter.CollidesWith += 1 << (int) CollisionFilters.Ramps ; // Ramps.
            // collisionFilter.CollidesWith += 1 << (int) CollisionFilters.Other ; // Other. // Optional

            var raycastInput = new RaycastInput
            {
                Start  = pointerRay.origin,
                End    = pointerRay.origin + pointerRay.direction * 200,
                Filter = CollisionFilter.Default
            };

            // raycastInput.Filter.CollidesWith = 2 ; // Scores layer.
            raycastInput.Filter.CollidesWith = collisionFilter.CollidesWith;  // Barriers layer.

            var collector = new IgnoreTransparentClosestHitCollector(collisionWorld);

            if (collisionWorld.CastRay(raycastInput, ref collector))
            {
                if (Input.GetMouseButtonUp(0) || Input.GetMouseButtonUp(1))
                {
                    Debug.Log("Hits: " + collector.ClosestHit.Entity + " @ pos: " + collector.ClosestHit.Position);

                    ComponentDataFromEntity <PathPlannerComponent> a_pathPlanners = GetComponentDataFromEntity <PathPlannerComponent> (false);

                    NativeArray <Entity> na_pathPlanners = group_pathPlanners.ToEntityArray(Allocator.TempJob);

                    Entity pathPlannersEntity;
                    PathPlannerComponent pathPlanner;;

                    // Test.
                    for (int i = 0; i < na_pathPlanners.Length; i++)
                    {
                        pathPlannersEntity = na_pathPlanners [i];
                        pathPlanner        = a_pathPlanners [pathPlannersEntity];

                        if (Input.GetMouseButtonUp(0))
                        {
                            // A
                            pathPlanner.entityA = collector.ClosestHit.Entity;
                        }
                        else if (Input.GetMouseButtonUp(1))
                        {
                            // B
                            pathPlanner.entityB = collector.ClosestHit.Entity;
                        }

                        a_pathPlanners [pathPlannersEntity] = pathPlanner;  // Set back
                    } // for

                    pathPlannersEntity = na_pathPlanners [0];
                    pathPlanner        = a_pathPlanners [pathPlannersEntity];

                    na_pathPlanners.Dispose();

                    if (pathPlanner.entityA.Version > 0 && pathPlanner.entityB.Version > 0)
                    {
                        EntityCommandBuffer.ParallelWriter ecbp = becb.CreateCommandBuffer().AsParallelWriter();

                        Debug.Log("Start entity: " + pathPlanner.entityA + " target entity: " + pathPlanner.entityB);

                        Entities
                        .WithName("OrderPathSearchJob")
                        .WithAll <IsAliveTag, PathPlannerComponent> ()
                        .ForEach((Entity entity, int entityInQueryIndex) =>
                        {
                            ecbp.AddComponent <CanFindPathTag> (entityInQueryIndex, entity);
                        }).Schedule();

                        becb.AddJobHandleForProducer(Dependency);
                    }
                }
            }
        }
コード例 #4
0
        protected override void OnUpdate( )
        {
            CollisionWorld collisionWorld = buildPhysicsWorld.PhysicsWorld.CollisionWorld;
            // Dependency                    = JobHandle.CombineDependencies ( Dependency, endFramePhysicsSystem.GetOutputDependency ()) ;

            var na_rays     = this.na_rays;
            int i_raysCount = this.i_raysCount;


            Entities
            .WithName("LIDARJob")
            .WithAll <NNBrainTag, LIDARTag, IsAliveTag> ()
            .WithNone <NNIsFinishedTag> ()
            .WithReadOnly(collisionWorld)
            // .WithReadOnly ( collector )
            .WithReadOnly(na_rays)
            .ForEach((ref DynamicBuffer <NNInputNeuronsValuesBuffer> a_inputLayerValues, in Translation position, in Rotation q, in VehicleVelocityComponent velocity) =>
            {
                float3 f3_startPoint = position.Value;


                for (int i = 0; i < i_raysCount; i++)
                {
                    quaternion q_rayDirection = na_rays [i];

                    float3 f3_endPoint = f3_startPoint + math.mul(math.mul(q.Value, q_rayDirection), Vector3.forward) * 3;

                    var raycastInput = new RaycastInput
                    {
                        Start  = f3_startPoint,
                        End    = f3_endPoint,
                        Filter = CollisionFilter.Default
                    };

                    // raycastInput.Filter.CollidesWith = 2 ; // Scores layer.
                    raycastInput.Filter.CollidesWith = 1;  // Barriers layer.

                    float f_input = -1;

                    var collector = new IgnoreTransparentClosestHitCollector(collisionWorld);

                    if (collisionWorld.CastRay(raycastInput, ref collector))
                    {
                        Unity.Physics.RaycastHit hit = collector.ClosestHit;

// Debug.DrawLine ( f3_startPoint, f3_endPoint, Color.red ) ;
// Debug.DrawLine ( f3_startPoint, hit.Position, Color.green ) ; // Length of ray, until hit collider.

                        f_input = math.lengthsq(hit.Position - f3_startPoint);
                    }
                    // else
                    // {
// Debug.DrawLine ( f3_startPoint, f3_endPoint, Color.blue ) ;
                    // }

                    a_inputLayerValues [i] = new NNInputNeuronsValuesBuffer()
                    {
                        f = f_input
                    };
                }

                a_inputLayerValues [a_inputLayerValues.Length - 1] = new NNInputNeuronsValuesBuffer()
                {
                    f = math.length(velocity.f_forwardSpeed)
                };
                a_inputLayerValues [a_inputLayerValues.Length - 2] = new NNInputNeuronsValuesBuffer()
                {
                    f = math.length(velocity.f_sideWaySkiddSpeed)
                };
            }).ScheduleParallel();
        protected override void OnUpdate()
        {
            CollisionWorld collisionWorld = buildPhysicsWorld.PhysicsWorld.CollisionWorld;

            // EntityCommandBuffer commandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer();
            Dependency = JobHandle.CombineDependencies(Dependency, endFramePhysicsSystem.GetOutputDependency());

            // UnityEngine.Debug.Log ( "Ray 2" ) ;


            Vector3 f3_point    = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            float3  f3_endPoint = f3_point - Vector3.up * 200;

            Debug.DrawLine(f3_point, f3_endPoint, Color.yellow);

            // Perform the Raycast
            var raycastInput = new RaycastInput
            {
                Start  = f3_point,
                End    = f3_endPoint,
                Filter = CollisionFilter.Default
            };

            // Debug.Log ( raycastInput.Filter.BelongsTo + "; " + raycastInput.Filter.CollidesWith + "; " + raycastInput.Filter.GroupIndex ) ;
            // raycastInput.Filter.CollidesWith = 0 ;

            raycastInput.Filter.CollidesWith = 2;

            var collector = new IgnoreTransparentClosestHitCollector(collisionWorld);

            collisionWorld.CastRay(raycastInput, ref collector);

            var hit         = collector.ClosestHit;
            var hitDistance = 200 * hit.Fraction;

            Debug.DrawLine(f3_point, f3_point - Vector3.up * hitDistance, Color.green);

            if (hitDistance != 0)
            {
                Debug.Log("Try hit at: " + hitDistance);
            }

            /*
             * Entities
             *  .WithName("RaycastWithCustomCollector")
             *  .WithBurst()
             *  .ForEach((Entity entity, ref Translation position, ref Rotation rotation, ref VisualizedRaycast visualizedRaycast) =>
             *  {
             *      var raycastLength = visualizedRaycast.RayLength;
             *
             *      // Perform the Raycast
             *      var raycastInput = new RaycastInput
             *      {
             *          Start = position.Value,
             *          End = position.Value + (math.forward(rotation.Value) * visualizedRaycast.RayLength),
             *          Filter = CollisionFilter.Default
             *      };
             *
             *      var collector = new IgnoreTransparentClosestHitCollector(collisionWorld);
             *
             *      collisionWorld.CastRay(raycastInput, ref collector);
             *
             *      var hit = collector.ClosestHit;
             *      var hitDistance = raycastLength * hit.Fraction;
             *
             *      // position the entities and scale based on the ray length and hit distance
             *      // visualization elements are scaled along the z-axis aka math.forward
             *      var newFullRayPosition = new float3(0, 0, raycastLength * 0.5f);
             *      var newFullRayScale = new float3(1f, 1f, raycastLength);
             *      var newHitPosition = new float3(0, 0, hitDistance);
             *      var newHitRayPosition = new float3(0, 0, hitDistance * 0.5f);
             *      var newHitRayScale = new float3(1f, 1f, raycastLength * hit.Fraction);
             *
             *      commandBuffer.SetComponent(visualizedRaycast.HitPositionEntity, new Translation { Value = newHitPosition });
             *      commandBuffer.SetComponent(visualizedRaycast.HitRayEntity, new Translation { Value = newHitRayPosition });
             *      commandBuffer.SetComponent(visualizedRaycast.HitRayEntity, new NonUniformScale { Value = newHitRayScale });
             *      commandBuffer.SetComponent(visualizedRaycast.FullRayEntity, new Translation { Value = newFullRayPosition });
             *      commandBuffer.SetComponent(visualizedRaycast.FullRayEntity, new NonUniformScale { Value = newFullRayScale });
             *  }).Schedule();
             *
             * m_EntityCommandBufferSystem.AddJobHandleForProducer(Dependency);
             */
        }