// raycast caring about both where and what was hit
    private bool Raycast(float3 fromPosition, float3 toPosition, ref Unity.Physics.RaycastHit hit, ref Entity e)
    {
        BuildPhysicsWorld buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <Unity.Physics.Systems.BuildPhysicsWorld>(); //Get the build physics world
        CollisionWorld    collisionWorld    = buildPhysicsWorld.PhysicsWorld.CollisionWorld;                                                       //get the collision world

        RaycastInput raycastInput = new RaycastInput {
            Start  = fromPosition,
            End    = toPosition,
            Filter = new CollisionFilter {
                BelongsTo    = ~0u, // belongs to all layers
                CollidesWith = ~0u, // collides with all layers
                GroupIndex   = 0,   // a new group
            }
        };

        if (collisionWorld.CastRay(raycastInput, out hit)) // use the collision world to cast a ray
        // hit something
        {
            e = buildPhysicsWorld.PhysicsWorld.Bodies[hit.RigidBodyIndex].Entity;
            return(true);
        }
        else
        {
            return(false);
        }
    }
        public void Execute(int index)
        {
            var hit = new RaycastHit();

            m_world.CastRay(m_inputs[index], out hit);
            m_results[index] = hit;
        }
            public unsafe void Execute(int index)
            {
                RaycastHit hit;

                world.CastRay(inputs[index], out hit);
                results[index] = hit;
            }
    protected override void OnUpdate()
    {
        Entities.ForEach((ref PhysicsControllerStruct player, ref Translation trans) =>
        {
            //Ground check
            float3 pos    = trans.Value;
            float3 target = pos;
            target.y     -= 1.15f;

            RaycastInput rInput = new RaycastInput()
            {
                Start  = pos,
                End    = target,
                Filter = new CollisionFilter()
                {
                    BelongsTo    = 1,
                    CollidesWith = 2,
                    GroupIndex   = 1
                }
            };

            BuildPhysicsWorld physWorld   = World.Active.GetExistingSystem <BuildPhysicsWorld>();
            CollisionWorld collisionWorld = physWorld.PhysicsWorld.CollisionWorld;

            //Ground check raycast
            player.isGrounded = collisionWorld.CastRay(rInput, out RaycastHit hit);

            //Rigidbody hit
            player.rbIndex = hit.RigidBodyIndex;
        });
    }
            public void Execute()
            {
                var mousePickCollector = new MousePickCollector(1.0f, CollisionWorld.Bodies, NumDynamicBodies);

                mousePickCollector.IgnoreTriggers = IgnoreTriggers;

                CollisionWorld.CastRay(RayInput, ref mousePickCollector);
                if (mousePickCollector.MaxFraction < 1.0f)
                {
                    float     fraction = mousePickCollector.Hit.Fraction;
                    RigidBody hitBody  = CollisionWorld.Bodies[mousePickCollector.Hit.RigidBodyIndex];

                    MTransform bodyFromWorld = Inverse(new MTransform(hitBody.WorldFromBody));
                    float3     pointOnBody   = Mul(bodyFromWorld, mousePickCollector.Hit.Position);

                    SpringData[0] = new SpringData
                    {
                        Entity      = hitBody.Entity,
                        Dragging    = 1,
                        PointOnBody = pointOnBody,
                        MouseDepth  = Near + math.dot(math.normalize(RayInput.End - RayInput.Start), Forward) * fraction * k_MaxDistance,
                    };
                }
                else
                {
                    SpringData[0] = new SpringData
                    {
                        Dragging = 0
                    };
                }
            }
예제 #6
0
            public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
            {
                var chunkTranslations             = chunk.GetNativeArray(TranslationType);
                var chunkRotations                = chunk.GetNativeArray(RotationType);
                var chunkObstacleDistanceSettings = chunk.GetNativeArray(ObstacleDistanceSettingComponentType);
                var chunkObstacleDistances        = chunk.GetNativeArray(ObstacleDistanceComponentType);

                for (var i = 0; i < chunk.Count; ++i)
                {
                    var     translation = chunkTranslations[i].Value;
                    var     rotation    = chunkRotations[i].Value;
                    var     setting     = chunkObstacleDistanceSettings[i];
                    ref var od          = ref chunkObstacleDistances.AsWritableRef(i);
                    var     ray         = new RaycastInput {
                        Start  = translation,
                        End    = translation + math.mul(rotation, new float3(0, 0, 10000)),
                        Filter = setting.Filter,
                    };
                    bool  hitted   = MCollisionWorld.CastRay(ray, out var hit);
                    float distance = float.MaxValue;
                    if (hitted)
                    {
                        var diff = hit.Position - translation;
                        distance = math.length(diff);
                    }
                    od.Distance = distance;
                }
예제 #7
0
    private Entity Raycast(float3 fromPosition, float3 toPosition)
    {
        BuildPhysicsWorld buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <BuildPhysicsWorld>();
        CollisionWorld    collisionWorld    = buildPhysicsWorld.PhysicsWorld.CollisionWorld;

        RaycastInput raycastInput = new RaycastInput {
            Start  = fromPosition,
            End    = toPosition,
            Filter = new CollisionFilter {
                BelongsTo    = ~0u,
                CollidesWith = ~0u,
                GroupIndex   = 0,
            }
        };

        Unity.Physics.RaycastHit raycastHit = new Unity.Physics.RaycastHit();

        if (collisionWorld.CastRay(raycastInput, out raycastHit))
        {
            // Hit
            Entity hitEntity = buildPhysicsWorld.PhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
            return(hitEntity);
        }
        else
        {
            return(Entity.Null);
        }
    }
예제 #8
0
        public void Execute(ref Translation translation, ref LocalToWorld c2)
        {
            // Check the collisionworld for a hit
            var hit = CollisionWorld.CastRay(new RaycastInput
            {
                Start = translation.Value, End = translation.Value + maths.down * 10, Filter = CollisionFilter.Default
            },
                                             out var rayHit);

            if (!hit)
            {
                return;
            }

            // Early return if the index is invalid
            if (rayHit.RigidBodyIndex <= 0)
            {
                return;
            }

            var hitentity  = CollisionWorld.Bodies[rayHit.RigidBodyIndex].Entity;
            var hitbody    = CollisionWorld.Bodies[rayHit.RigidBodyIndex]; //RigidBody?
            var instigator = Entity.Null;

            Debug.Log(hitentity);
        }
예제 #9
0
        protected override void OnUpdate()
        {
            CollisionWorld collisionWorld = _buildPhysicsWorld.PhysicsWorld.CollisionWorld;

            Entities.WithReadOnly(collisionWorld).ForEach((ref RayCasterPoint rayCaster, in LocalToWorld l2w, in Rotation rot) =>
            {
                var rayInput = new RaycastInput
                {
                    Start  = l2w.Position,
                    End    = l2w.Position - rayCaster.castLength * l2w.Up,
                    Filter = new CollisionFilter()
                    {
                        BelongsTo    = ~0u,
                        CollidesWith = ~0u,
                        GroupIndex   = 0
                    }
                };
                Debug.DrawLine(l2w.Position, l2w.Position - rayCaster.castLength * l2w.Up);
                rayCaster.hasHit = collisionWorld.CastRay(rayInput, out var hit);
                if (rayCaster.hasHit)
                {
                    rayCaster.stablePosition     = hit.Position + hit.SurfaceNormal * 0.2f;
                    rayCaster.stableUpsideVector = hit.SurfaceNormal;
                    Debug.DrawLine(hit.Position, hit.Position + hit.SurfaceNormal * 0.2f, Color.red);
                }
            }).ScheduleParallel();
    private bool Raycast(float3 from, float3 to, out float3 point, out Entity entity)
    {
        BuildPhysicsWorld physicsWorld   = World.GetOrCreateSystem <BuildPhysicsWorld>();
        CollisionWorld    collisionWorld = physicsWorld.PhysicsWorld.CollisionWorld;

        RaycastInput raycastInput = new RaycastInput
        {
            Start  = from,
            End    = to,
            Filter = new CollisionFilter
            {
                BelongsTo    = ~0u,
                CollidesWith = ~0u,
                GroupIndex   = 0
            }
        };

        var hit = new Unity.Physics.RaycastHit();

        if (collisionWorld.CastRay(raycastInput, out hit))
        {
            point  = hit.Position;
            entity = hit.Entity;
            return(true);
        }

        point  = hit.Position;
        entity = hit.Entity;
        return(false);
    }
예제 #11
0
    public Entity Raycast(float3 startPos, float3 endPos)
    {
        //首先获取物理世界
        BuildPhysicsWorld physicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <BuildPhysicsWorld>();
        //然后获取碰撞世界
        CollisionWorld collisionWorld = physicsWorld.PhysicsWorld.CollisionWorld;

        RaycastInput raycastInput = new RaycastInput()
        {
            Start = startPos,
            End   = endPos,
            //声明碰撞过滤器,用来过滤某些层级下的物体是否进行射线检测
            Filter = CollisionFilter.Default,
            //Filter = new CollisionFilter()
            //{
            //    BelongsTo = ~0u,
            //    CollidesWith = ~0u,
            //    GroupIndex = 0,
            //}
        };

        //发射射线去检测Entity实体
        if (collisionWorld.CastRay(raycastInput, out raycastHit))
        {
            isGo = true;
            //拿到我们射线击中的entity
            Entity entity = physicsWorld.PhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
            return(entity);
        }
        else
        {
            Debug.Log("Notthing Found");
            return(Entity.Null);
        }
    }
예제 #12
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);
    }
    public static bool CastRay(float3 start, float3 end, out Unity.Physics.RaycastHit result, CollisionWorld world, CollisionFilter filter)
    {
        var input = new RaycastInput
        {
            Start  = start,
            End    = end,
            Filter = filter,
        };

        return(world.CastRay(input, out result));
    }
            public void Execute()
            {
                var mousePickCollector = new MousePickCollector(1.0f, CollisionWorld.Bodies, CollisionWorld.NumDynamicBodies);

                mousePickCollector.IgnoreTriggers = IgnoreTriggers;
                mousePickCollector.IgnoreStatic   = IgnoreStatic;

                if (CollisionWorld.CastRay(RayInput, ref mousePickCollector))
                {
                    RaycastHitRef.Value = mousePickCollector.Hit;
                }
            }
예제 #16
0
        public void Execute(ArchetypeChunk batchInChunk, int batchIndex)
        {
            var boidChunk              = batchInChunk.GetNativeArray(boidTypeHandle);
            var translationsChunk      = batchInChunk.GetNativeArray(translationTypeHandle);
            var ltwChunk               = batchInChunk.GetNativeArray(ltwTypeHandle);
            var obstacleAvoidanceChunk = batchInChunk.GetNativeArray(obstacleAvoidanceTypeHandle);
            var rotationChunk          = batchInChunk.GetNativeArray(rotationTypeHandle);


            for (int i = 0; i < batchInChunk.Count; i++)
            {
                float3            force = Vector3.zero;
                Translation       p     = translationsChunk[i];
                ObstacleAvoidance oa    = obstacleAvoidanceChunk[i];
                LocalToWorld      ltw   = ltwChunk[i];
                Boid     b = boidChunk[i];
                Rotation r = rotationChunk[i];

                oa.normal = Vector3.zero;
                oa.point  = Vector3.zero;

                float3 forward = math.mul(r.Value, Vector3.forward);
                forward = math.normalize(forward);
                var input = new RaycastInput()
                {
                    Start = p.Value,
                    End   = p.Value + (forward * oa.forwardFeelerDepth),

                    //Filter = CollisionFilter.Default
                    Filter = new CollisionFilter {
                        BelongsTo    = ~0u,
                        CollidesWith = ~0u,
                        GroupIndex   = 0
                    }
                };

                oa.start = input.Start;
                oa.end   = input.End;

                Unity.Physics.RaycastHit hit;
                if (collisionWorld.CastRay(input, out hit))
                {
                    Debug.Log("Collides");
                    float dist = math.distance(hit.Position, p.Value);
                    force    += hit.SurfaceNormal * (oa.forwardFeelerDepth / dist);
                    oa.normal = hit.SurfaceNormal;
                    oa.point  = hit.Position;
                }
                oa.force = force;
                obstacleAvoidanceChunk[i] = oa;
            }
        }
예제 #17
0
    public static bool CastRayFromMouse(float3 cameraPos, float3 mouseWorldPos, float distance, out Unity.Physics.RaycastHit closestHit, CollisionFilter collisionFilter, CollisionWorld collisionWorld)
    {
        float3 origin    = cameraPos;
        float3 direction = math.normalize(mouseWorldPos - origin);

        RaycastInput rayInput = new RaycastInput()
        {
            Start  = origin,
            End    = origin + (direction * distance),
            Filter = collisionFilter
        };

        return(collisionWorld.CastRay(rayInput, out closestHit));
    }
예제 #18
0
        private bool Raycast(float3 rayFrom, float3 rayTo, out RaycastHit raycastHit)
        {
            var input = new RaycastInput()
            {
                Start  = rayFrom,
                End    = rayTo,
                Filter = new CollisionFilter
                {
                    BelongsTo    = (uint)CollisionLayers.Selection,
                    CollidesWith = (uint)(CollisionLayers.Ground | CollisionLayers.Units)
                }
            };

            return(_collisionWorld.CastRay(input, out raycastHit));
        }
            public void Execute()
            {
                float     fraction = 1.0f;
                RigidBody?hitBody  = null;

                if (CollisionWorld.CastRay(RayInput, out RaycastHit hit))
                {
                    if (hit.RigidBodyIndex < NumStaticBodies)
                    {
                        hitBody = CollisionWorld.Bodies[hit.RigidBodyIndex];
                        //Debug.Log(hitBody);
                        //commandBuffer.AddComponent(hitBody.Value.Entity, new Selected());
                        selected[0] = hitBody.Value.Entity;
                    }
                }
            }
예제 #20
0
    /// <summary>
    /// BuildPhysicsWorld physicsWorldSystem = World.DefaultGameObjectInjectionWorld.GetOrCreateSystem<BuildPhysicsWorld>();
    /// CollisionWorld collisionWorld = physicsWorldSystem.PhysicsWorld.CollisionWorld;
    /// </summary>
    /// <param name="RayFrom"></param>
    /// <param name="RayTo"></param>
    /// <param name="collidesWithMask"></param>
    /// <param name="belongsToMask"></param>
    /// <param name="physicsWorld"></param>
    /// <returns></returns>
    public static bool Raycast(float3 RayFrom, float3 RayTo, uint collidesWithMask, uint belongsToMask, PhysicsWorld physicsWorld)
    {
        CollisionWorld collisionWorld = physicsWorld.CollisionWorld;
        RaycastInput   input          = new RaycastInput()
        {
            Filter = new CollisionFilter()
            {
                CollidesWith = collidesWithMask,
                BelongsTo    = belongsToMask,
                GroupIndex   = 0
            },
            Start = RayFrom,
            End   = RayTo
        };

        return(collisionWorld.CastRay(input));
    }
예제 #21
0
    /// <summary>
    /// Performs a raycast along the specified ray and returns all resulting <see cref="RaycastHit"/>s.<para/>
    /// The caller must dispose of the returned list.
    /// </summary>
    /// <param name="collisionWorld"></param>
    /// <param name="from"></param>
    /// <param name="to"></param>
    /// <param name="ignore">Will ignore this entity if it was hit. Useful to prevent returning hits from the caster.</param>
    /// <param name="filter"></param>
    /// <returns></returns>
    public unsafe static NativeList <RaycastHit> RaycastAll(float3 from, float3 to, ref CollisionWorld collisionWorld, Entity ignore, CollisionFilter?filter = null, Allocator allocator = Allocator.TempJob)
    {
        RaycastInput input = new RaycastInput()
        {
            Start  = from,
            End    = to,
            Filter = (filter.HasValue ? filter.Value : PhysicsCollisionFilters.AllWithAll)
        };

        NativeList <RaycastHit> allHits = new NativeList <RaycastHit>(allocator);

        if (collisionWorld.CastRay(input, ref allHits))
        {
            TrimByEntity(ref allHits, ignore);
        }

        return(allHits);
    }
예제 #22
0
        public void OnMouseLeftButton(InputAction.CallbackContext context)
        {
            BuildPhysicsWorld stepWorld      = World.GetOrCreateSystem <BuildPhysicsWorld>();
            CollisionWorld    collisionWorld = stepWorld.PhysicsWorld.CollisionWorld;
            Ray          ray          = Camera.main.ScreenPointToRay(mousePosition);
            RaycastInput raycastInput = new RaycastInput
            {
                Start  = ray.origin,
                End    = ray.origin + ray.direction * 1000f,
                Filter = CollisionFilter.Default,
            };
            RaycastHit closestHit = new RaycastHit();

            if (collisionWorld.CastRay(raycastInput, out closestHit))
            {
                Bang(closestHit.Position);
            }
        }
예제 #23
0
            private bool Visible
            (
                ref CollisionWorld world,
                float3 position,
                float3 detectedPos,
                ref FieldOfView setting)
            {
                var input = new RaycastInput
                {
                    Start  = position,
                    End    = detectedPos,
                    Filter = new CollisionFilter
                    {
                        BelongsTo = setting.SelfTag.Value, CollidesWith = setting.TargetTag.Value
                    }
                };

                return(world.CastRay(input, out var hit));
            }
예제 #24
0
            public void Execute()
            {
                float     fraction = 1.0f;
                RigidBody?hitBody  = null;

                var rayCastInput = new RaycastInput {
                    Ray = Ray, Filter = CollisionFilter.Default
                };

                if (CollisionWorld.CastRay(rayCastInput, out RaycastHit hit))
                {
                    if (hit.RigidBodyIndex < NumDynamicBodies)
                    {
                        hitBody  = CollisionWorld.Bodies[hit.RigidBodyIndex];
                        fraction = hit.Fraction;
                    }
                }

                // If there was a hit, set up the spring
                if (hitBody != null)
                {
                    float3     pointInWorld  = (Ray.Origin + Ray.Direction * fraction);
                    MTransform bodyFromWorld = Inverse(new MTransform(hitBody.Value.WorldFromBody));
                    float3     pointOnBody   = Mul(bodyFromWorld, pointInWorld);

                    SpringData[0] = new SpringData
                    {
                        Entity      = hitBody.Value.Entity,
                        Dragging    = 1,
                        PointOnBody = pointOnBody,
                        MouseDepth  = Near + math.dot(math.normalize(Ray.Direction), Forward) * fraction * k_MaxDistance
                    };
                }
                else
                {
                    SpringData[0] = new SpringData
                    {
                        Dragging = 0
                    };
                }
            }
예제 #25
0
    protected override void OnUpdate()
    {
        BuildPhysicsWorld buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <BuildPhysicsWorld>();
        CollisionWorld    collisionWorld    = buildPhysicsWorld.PhysicsWorld.CollisionWorld;
        var player = GetSingletonEntity <Player>();
        // Get player translation component
        ComponentDataFromEntity <Translation> translations = GetComponentDataFromEntity <Translation>(true);
        Translation playerTranslate = translations[player];
        float3      start           = new float3 {
            x = playerTranslate.Value.x, y = playerTranslate.Value.y, z = playerTranslate.Value.z
        };

        ComponentDataFromEntity <Player> playerEntities = GetComponentDataFromEntity <Player>(false);
        RaycastInput input = new RaycastInput
        {
            Start  = start,
            End    = Vector3.down,
            Filter = CollisionFilter.Default
        };
        Player playerInfo = playerEntities[player]; // Getting the player info
        bool   grounded   = false;
        NativeList <Unity.Physics.RaycastHit> allHits = new NativeList <Unity.Physics.RaycastHit>(Allocator.Temp);

        if (collisionWorld.CastRay(input, ref allHits)) // If something is right beneath the player - the player shall be grounded
        {
            foreach (var rayHit in allHits)
            {
                Entity hitEntity = buildPhysicsWorld.PhysicsWorld.Bodies[rayHit.RigidBodyIndex].Entity;
                if (hitEntity != player)
                {
                    if (Vector3.Distance(start, rayHit.Position) < 0.7)
                    {
                        grounded = true;
                        break;
                    }
                }
            }
        }
        playerInfo.isGrounded  = grounded;
        playerEntities[player] = playerInfo; // Reassigning the info to the array
    }
예제 #26
0
        public void Execute()
        {
            var raycastInput = new RaycastInput
            {
                Start  = CameraLocation,
                End    = CameraDirection * 500 + CameraLocation,
                Filter = new CollisionFilter
                {
                    BelongsTo        = 1u << 2,
                        CollidesWith = 1u << 1,
                        GroupIndex   = 0
                }
            };

            if (!CollisionWorld.CastRay(raycastInput, out var terrainHit))
            {
                return;
            }

            Endpoint[0] = terrainHit.Position;
        }
예제 #27
0
        private bool GetPointInWorldFromMousePosition(out float3 pointInWorld)
        {
            CollisionWorld collisionWorld = m_BuildPhysicsWorldSystem.PhysicsWorld.CollisionWorld;
            // Create a new Ray from the camera screen
            Vector2 mousePosition = Input.mousePosition;

            UnityEngine.Ray unityRay = Camera.main.ScreenPointToRay(mousePosition);
            var             ray      = new Ray(unityRay.origin, unityRay.direction * k_MaxDistance);

            var       fraction = 1.0f;
            RigidBody?hitBody  = null;

            // Now cast the ray and see if the it hits any colliders.
            var rayCastInput = new RaycastInput
            {
                Ray = ray, Filter = new CollisionFilter
                {
                    CategoryBits = ~0u << 2,                // Belongs to group Raycasts
                        MaskBits = ~0u << 2                 // Only collides with Raycasts group
                }
            };

            if (collisionWorld.CastRay(rayCastInput, out RaycastHit hit))
            {
                hitBody  = collisionWorld.Bodies[hit.RigidBodyIndex];
                fraction = hit.Fraction;
            }

            // If we have a hit, then we'll update the singleton data with
            // the x and z values. (we're not doing anything with y at the moment)
            if (hitBody != null)
            {
                pointInWorld = ray.Origin + ray.Direction * fraction;
                return(true);
            }

            // default value
            pointInWorld = float3.zero;
            return(false);
        }
예제 #28
0
    private Entity EntityRaycast(float3 from, float3 to)
    {
        buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <BuildPhysicsWorld>();
        collisionWorld    = buildPhysicsWorld.PhysicsWorld.CollisionWorld;
        RaycastInput raycastInput = new RaycastInput
        {
            Start  = from,
            End    = to,
            Filter = raycastFilter
        };

        Unity.Physics.RaycastHit raycastHit = new Unity.Physics.RaycastHit();

        if (collisionWorld.CastRay(raycastInput, out raycastHit))
        {
            Entity hitEntity = buildPhysicsWorld.PhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
            return(hitEntity);
        }
        else
        {
            return(Entity.Null);
        }
    }
예제 #29
0
    private Entity Raycast(float3 fromPosition, float3 toPosition)
    {
        // Get the CollisionWorld
        BuildPhysicsWorld buildPhysicsWorld = World.DefaultGameObjectInjectionWorld.GetExistingSystem <BuildPhysicsWorld>();
        CollisionWorld    collisionWorld    = buildPhysicsWorld.PhysicsWorld.CollisionWorld;

        // Create Raycast Input, Filters are essentially layers from old raycast
        // ~0u is a bit operation not, meaning we get all bits after 1 and includes all layers
        // Group Index is used to filter for collisions by overriding the bitmask
        RaycastInput raycastInput = new RaycastInput
        {
            Start  = fromPosition,
            End    = toPosition,
            Filter = new CollisionFilter
            {
                BelongsTo    = ~0u,
                CollidesWith = ~0u,
                GroupIndex   = 0
            }
        };

        // Create a RaycastHit
        Unity.Physics.RaycastHit raycastHit = new Unity.Physics.RaycastHit();

        // Create Ray, returns a bool
        if (collisionWorld.CastRay(raycastInput, out raycastHit)) // Can also use a NativeList of RaycastHits for all hits
        {
            // Hit Something
            Entity hitEntity = buildPhysicsWorld.PhysicsWorld.Bodies[raycastHit.RigidBodyIndex].Entity;
            return(hitEntity);
        }
        else
        {
            return(Entity.Null);
        }
    }
 public void Execute(int index)
 {
     Unity.Physics.RaycastHit hit;
     world.CastRay(inputs[index], out hit);
     results[index] = hit;
 }