/// <summary>
        /// Using Raycasts to gather information about surrounding environment.
        /// </summary>
        private bool UpdateHits(ref List <RaycastHit> hits)
        {
            //Check for collision under the player
            if (RayHelper.Raycast(transform, RayDownLeftProperties, out var rightHitInfo, GroundLayer) &&
                RayHelper.Raycast(transform, RayDownRightProperties, out var leftHitInfo, GroundLayer))
            {
                hits.Add(leftHitInfo);
                hits.Add(rightHitInfo);


                //Raycast to right only active if player is moving to the right
                if (MoveDirection.x > 0)
                {
                    if (RayHelper.Raycast(transform, RayRightProperties, out var rightHit, GroundLayer))
                    {
                        hits.Add(rightHit);
                    }
                }

                //Raycast to left only active if player is moving to the left
                if (MoveDirection.x < 0)
                {
                    if (RayHelper.Raycast(transform, RayLeftProperties, out var leftHit, GroundLayer))
                    {
                        hits.Add(leftHit);
                    }
                }

                return(true);
            }

            return(false);
        }
Example #2
0
 void Start()
 {
     SkipPlayerMask = RayHelper.allButLayerMask("Player");
     _rigidbody     = GetComponent <Rigidbody>();
 }
Example #3
0
        public void GetMouseOverObject()
        {
            if (World == null)
            {
                return;
            }

            float radius = 5.5f;

            MouseOverObject final = new MouseOverObject();

            float dist = float.MaxValue;

            Vector3 camPos = Vector3.One * 0.5f + Camera.Pos;

            var air = BlockRegistry.GetBlock <BlockAir>();

            for (float z = -radius; z <= radius; z++)
            {
                for (float y = -radius; y <= radius; y++)
                {
                    for (float x = -radius; x <= radius; x++)
                    {
                        Vector3 vec = camPos;
                        vec.X += x;
                        vec.Y += y;
                        vec.Z += z;

                        float f = (vec - Camera.Pos).LengthFast;

                        if (f <= radius + 0.5f)
                        {
                            BlockPos   pos   = new BlockPos(vec);
                            BlockState state = World.GetBlockState(pos);

                            if (state.Block != air)
                            {
                                AxisAlignedBb bb = state.Block.BoundingBox.Offset(pos.ToVec());

                                bool hitSomething = RayHelper.RayIntersectsBB(Camera.Pos,
                                                                              Camera.GetLookVec(), bb, out Vector3 hitPos, out Vector3 normal);

                                if (hitSomething)
                                {
                                    FaceSides sideHit = FaceSides.Null;

                                    if (normal.X < 0)
                                    {
                                        sideHit = FaceSides.West;
                                    }
                                    else if (normal.X > 0)
                                    {
                                        sideHit = FaceSides.East;
                                    }
                                    if (normal.Y < 0)
                                    {
                                        sideHit = FaceSides.Down;
                                    }
                                    else if (normal.Y > 0)
                                    {
                                        sideHit = FaceSides.Up;
                                    }
                                    if (normal.Z < 0)
                                    {
                                        sideHit = FaceSides.North;
                                    }
                                    else if (normal.Z > 0)
                                    {
                                        sideHit = FaceSides.South;
                                    }

                                    BlockPos p = new BlockPos(hitPos - normal * bb.Size / 2);

                                    if (sideHit == FaceSides.Null)
                                    {
                                        continue;
                                    }

                                    float l = Math.Abs((Camera.Pos - (p.ToVec() + bb.Size / 2)).Length);

                                    if (l < dist)
                                    {
                                        dist = l;

                                        final.hit      = HitType.Block;
                                        final.hitVec   = hitPos;
                                        final.blockPos = p;
                                        final.normal   = normal;
                                        final.sideHit  = sideHit;

                                        final.boundingBox = bb;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            MouseOverObject = final;
        }