Example #1
0
    string GetCollisionDirection(RaycastDirection dir)
    {
        switch (dir)
        {
        case (RaycastDirection.FORWARD):
            return("Forward");

        case (RaycastDirection.FORWARD_RIGHT):
            return("Forward-Right");

        case (RaycastDirection.RIGHT):
            return("Right");

        case (RaycastDirection.BACK_RIGHT):
            return("Back-Right");

        case (RaycastDirection.BACK):
            return("Back");

        case (RaycastDirection.BACK_LEFT):
            return("Back-Left");

        case (RaycastDirection.LEFT):
            return("Left");

        case (RaycastDirection.FORWARD_LEFT):
            return("Forward-Left");

        default:
            return("Error?");
        }
    }
Example #2
0
    void WallDisplace(RaycastDirection dir, RaycastPosition pos, Vector3 collisionPt)
    {
        Vector3 displaceDir = DisplaceDirection(dir).normalized *width;
        float   posDisplace = DisplacePosition(pos);

        transform.position = (collisionPt - (Vector3.up * posDisplace)) - displaceDir;
    }
Example #3
0
    Vector3 DisplaceDirection(RaycastDirection dir)
    {
        switch (dir)
        {
        case (RaycastDirection.FORWARD):
            return(forward);

        case (RaycastDirection.FORWARD_RIGHT):
            return(forwardRight);

        case (RaycastDirection.RIGHT):
            return(right);

        case (RaycastDirection.BACK_RIGHT):
            return(backRight);

        case (RaycastDirection.BACK):
            return(back);

        case (RaycastDirection.BACK_LEFT):
            return(backLeft);

        case (RaycastDirection.LEFT):
            return(left);

        case (RaycastDirection.FORWARD_LEFT):
            return(forwardLeft);

        default:
            return(Vector3.zero);
        }
    }
Example #4
0
    /// <summary>
    /// Wallcast function for player with a large collider.
    /// Cast out from eight major directions, starting with forward and rotatinf to forward left, from
    /// groin region up to head.
    /// If collision is found, assign references as needed and stop checking.
    /// </summary>
    /// <param name="direction">Enum reference for detected collision detection.</param>
    /// <param name="position">Enum reference for relative position on player collision was at.</param>
    /// <param name="collisionPoint">Vector3 reference for where collision is detected at in the world.</param>
    void Wallcast(ref RaycastDirection direction, ref RaycastPosition position, ref Vector3 collisionPoint)
    {
        Vector3 raycastPos, raycastDir;

        /* For the three points on the player, starting from the groin up to the head, cast out starting from
         * forward and rotating around clockwise to forward left to determine if there is a collision. */
        for (int pos = (int)RaycastPosition.GROIN; pos <= (int)RaycastPosition.HEAD; pos++)
        {
            for (int dir = (int)RaycastDirection.FORWARD; dir <= (int)RaycastDirection.FORWARD_LEFT; dir++)
            {
                raycastPos = GetRaycastPosition((RaycastPosition)pos);
                raycastDir = GetRaycastDirection((RaycastDirection)dir);
                // If a collision is detected, assign the relative point, direction, and collision point in the world
                if (Raycast(raycastPos, raycastDir, (RaycastPosition)pos, (RaycastDirection)dir))
                {
                    Debug.Log("Collision Detected");
                    direction      = (RaycastDirection)dir;
                    position       = (RaycastPosition)pos;
                    collisionPoint = wallHits[8 * pos + dir].point;
                }
                // Stop looping through directions if a collision was detected
                if (direction != RaycastDirection.NULL)
                {
                    break;
                }
            }
            // Stop looping through player positions if a collision was detected
            if (direction != RaycastDirection.NULL)
            {
                break;
            }
        }
    }
Example #5
0
    void CheckCollisions_Walls()
    {
        // Wall Raycast direction, player position, and world point
        RaycastDirection colliDir = RaycastDirection.NULL;
        RaycastPosition  colPos   = RaycastPosition.GROIN;
        Vector3          colPt    = Vector3.one * DEFAULT_HIT_DUMMY;

        // Check for a wall hit, calling the corresponding function depending on the collider
        if (wallHits.Length == SMALL_COLLIDER_WALLCHECKS)
        {
            Wallcast(ref colliDir, ref colPt); // Check from center
            if (colliDir != RaycastDirection.NULL && !TestIncline())
            {
                Debug.Log("Collision detected in " + GetCollisionDirection(colliDir) + " direction");
                WallDisplace(colliDir, colPt);
            }
        }
        else
        {
            Wallcast(ref colliDir, ref colPos, ref colPt); // Check from groin, center, and head
            if (colliDir != RaycastDirection.NULL && !TestIncline())
            {
                Debug.Log("Collision Detected at " + GetCollisionPosition(colPos) + ", " + GetCollisionDirection(colliDir) + " direction");
                WallDisplace(colliDir, colPos, colPt);
            }
        }
    }
Example #6
0
    bool RaycastCollideVertical(RaycastDirection direction)
    {
        Ray floorRay_L, floorRay_R;

        if (direction == RaycastDirection.Down)
        {
            floorRay_L = new Ray(transform.position + floorRayLeftOffset, Vector3.down);
            floorRay_R = new Ray(transform.position + floorRayRightOffset, Vector3.down);
        }
        else if (direction == RaycastDirection.Up)
        {
            floorRay_L = new Ray(transform.position + floorRayLeftOffset, Vector3.up);
            floorRay_R = new Ray(transform.position + floorRayRightOffset, Vector3.up);
        }
        else
        {
            Debug.Log("RaycastCollideVertical() BAD DIRECTION");
            return(true);
        }

        RaycastHit floorHit;

        if (Physics.Raycast(floorRay_L, out floorHit, this.collider.bounds.extents.y + .1f))
        {
            if (floorHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Down)
                {
                    transform.position = new Vector3(transform.position.x, floorHit.point.y + this.collider.bounds.extents.y, 0);
                }
                else if (direction == RaycastDirection.Up)
                {
                    transform.position = new Vector3(transform.position.x, floorHit.point.y - this.collider.bounds.extents.y, 0);
                }

                return(true);
            }
        }
        else if (Physics.Raycast(floorRay_R, out floorHit, this.collider.bounds.extents.y + .1f))
        {
            if (floorHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Down)
                {
                    transform.position = new Vector3(transform.position.x, floorHit.point.y + this.collider.bounds.extents.y, 0);
                }
                else if (direction == RaycastDirection.Up)
                {
                    transform.position = new Vector3(transform.position.x, floorHit.point.y - this.collider.bounds.extents.y, 0);
                }

                return(true);
            }
        }
        return(false);
    }
    private float ClosestWallInDirection(RaycastDirection direction, float maxDistance)
    {
        float result = -1;

        Vector3 directionVector = default;

        switch (direction)
        {
        case RaycastDirection.Down:
            directionVector = Vector3.down;
            break;

        case RaycastDirection.Up:
            directionVector = Vector3.up;
            break;

        case RaycastDirection.Left:
            directionVector = Vector3.left;
            break;

        case RaycastDirection.Right:
            directionVector = Vector3.right;
            break;
        }

        var        colliderHeight = info.ColliderHeight * 0.99f;
        var        colliderWidth  = info.ColliderWidth * 0.99f;
        bool       indexZero      = true;
        RaycastHit hit;

        for (int i = 0; i < info.RaycastsPrecision; i++)
        {
            var     rayDistance = maxDistance;
            Vector3 startShift  = default;
            if (direction == RaycastDirection.Left || direction == RaycastDirection.Right)
            {
                var yShift = colliderHeight / 2 - i * colliderHeight / (info.RaycastsPrecision - 1);
                startShift = new Vector3(0, yShift, 0);
            }
            if (direction == RaycastDirection.Up || direction == RaycastDirection.Down)
            {
                var xShift = colliderWidth / 2 - i * colliderWidth / (info.RaycastsPrecision - 1);
                startShift = new Vector3(xShift, 0, 0);
            }
            if (Physics.Raycast(transform.position + startShift,
                                directionVector, out hit, rayDistance))
            {
                if (indexZero || hit.distance < result)
                {
                    result    = hit.distance;
                    indexZero = false;
                }
            }
        }
        return(result);
    }
Example #8
0
    // Start is called before the first frame update
    void Start()
    {
        globalData = GameObject.Find("GameManager").GetComponent <GlobalData>();

        RaycastDirection raycastDirection = GetComponent <RaycastDirection>();

        //Beschreibt den Versatz der "Augen" zum Creature Mittelpunkt
        raycastDirection.offsetStartPoint = new Vector3(0, 0, 0.6f);

        //Gibt die Richtung der Sensoren vor
        raycastDirection.directions.Add(new Vector3(0, -0.25f, 1));
        raycastDirection.directions.Add(new Vector3(0, 0, 1));
        raycastDirection.directions.Add(new Vector3(-0.5f, 0, 1));
        raycastDirection.directions.Add(new Vector3(0.5f, 0, 1));
    }
Example #9
0
    public Vector3 Raycaster(RaycastDirection direction)
    {
        float xMin = transform.position.x - Collider.bounds.min.x;
        float xMax = transform.position.x - Collider.bounds.max.x;

        RaycastHit hit;

        if (Physics.Raycast(transform.position + new Vector3(xMin, 0, 0), direction.Direction, out hit, direction.Length) ||
            Physics.Raycast(transform.position + new Vector3(xMax, 0, 0), direction.Direction, out hit, direction.Length) ||
            Physics.Raycast(transform.position, direction.Direction, out hit, direction.Length))
        {
            return(hit.point - (direction.Direction * direction.Length));
        }

        return(Vector3.zero);
    }
Example #10
0
    /// <summary>
    /// Wallcast function for player with a small collider.
    /// Cast out from eight major directions, starting with forward and rotating to forward left, from center.
    /// If collision is found, assign references as needed and stop checking.
    /// </summary>
    /// <param name="direction">Enum reference for detected collision direction. </param>
    /// <param name="collisionPoint">Vector3 reference for where collision is detected at in the world.</param>
    void Wallcast(ref RaycastDirection direction, ref Vector3 collisionPoint)
    {
        Vector3 raycastDir;

        // Cast out from the center of the player, rotating clockwise from forward to forward left, to determine if there is a collision.
        for (int dir = (int)RaycastDirection.FORWARD; dir <= (int)RaycastDirection.FORWARD_LEFT; dir++)
        {
            raycastDir = GetRaycastDirection((RaycastDirection)dir);
            // If a collision is detected, assign the direction and collision point in the world.
            if (Raycast(transform.position, raycastDir, RaycastPosition.GROIN, (RaycastDirection)dir))
            {
                direction      = (RaycastDirection)dir;
                collisionPoint = wallHits[dir].point;
            }
            // Stop looping through directions if a collision was detected
            if (direction != RaycastDirection.NULL)
            {
                break;
            }
        }
    }
Example #11
0
    bool RaycastCollideHorizontal(RaycastDirection direction)
    {
        Ray wallRay_T, wallRay_B, wallRay_M;

        if (direction == RaycastDirection.Right)
        {
            wallRay_T = new Ray(transform.position + wallRayTopOffset, Vector3.right);
            wallRay_M = new Ray(transform.position, Vector3.right);
            wallRay_B = new Ray(transform.position + wallRayBottomOffset, Vector3.right);
        }
        else if (direction == RaycastDirection.Left)
        {
            wallRay_T = new Ray(transform.position + wallRayTopOffset, Vector3.left);
            wallRay_M = new Ray(transform.position, Vector3.left);
            wallRay_B = new Ray(transform.position + wallRayBottomOffset, Vector3.left);
        }
        else
        {
            Debug.Log("RaycastCollideHorizontal() BAD DIRECTION");
            return(true);
        }

        RaycastHit wallHit;

        if (Physics.Raycast(wallRay_T, out wallHit, collider.bounds.extents.x + .1f))
        {
            if (wallHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Right)
                {
                    transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                }
                else if (direction == RaycastDirection.Left)
                {
                    transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);
                }

                return(true);
            }
        }
        else if (Physics.Raycast(wallRay_M, out wallHit, collider.bounds.extents.x + .1f))
        {
            if (wallHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Right)
                {
                    transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                }
                else if (direction == RaycastDirection.Left)
                {
                    transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);
                }

                return(true);
            }
        }
        else if (Physics.Raycast(wallRay_B, out wallHit, collider.bounds.extents.x + .1f))
        {
            if (wallHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Right)
                {
                    transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                }
                else if (direction == RaycastDirection.Left)
                {
                    transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);
                }

                return(true);
            }
        }
        return(false);
    }
Example #12
0
    bool RaycastCollideVertical(RaycastDirection direction)
    {
        Ray floorRay_L, floorRay_R;
        if (direction == RaycastDirection.Down)
        {
            floorRay_L = new Ray(transform.position + floorRayLeftOffset, Vector3.down);
            floorRay_R = new Ray(transform.position + floorRayRightOffset, Vector3.down);
        }
        else if (direction == RaycastDirection.Up)
        {
            floorRay_L = new Ray(transform.position + floorRayLeftOffset, Vector3.up);
            floorRay_R = new Ray(transform.position + floorRayRightOffset, Vector3.up);
        }
        else
        {
            Debug.Log("RaycastCollideVertical() BAD DIRECTION");
            return true;
        }

        RaycastHit floorHit;
        if (Physics.Raycast(floorRay_L, out floorHit, this.collider.bounds.extents.y + .1f))
        {
            if (floorHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Down)
                    transform.position = new Vector3(transform.position.x, floorHit.point.y + this.collider.bounds.extents.y, 0);
                else if (direction == RaycastDirection.Up)
                    transform.position = new Vector3(transform.position.x, floorHit.point.y - this.collider.bounds.extents.y, 0);

                return true;
            }
        }
        else if (Physics.Raycast(floorRay_R, out floorHit, this.collider.bounds.extents.y + .1f))
        {
            if (floorHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Down)
                    transform.position = new Vector3(transform.position.x, floorHit.point.y + this.collider.bounds.extents.y, 0);
                else if (direction == RaycastDirection.Up)
                    transform.position = new Vector3(transform.position.x, floorHit.point.y - this.collider.bounds.extents.y, 0);

                return true;
            }
        }
        return false;
    }
Example #13
0
    bool RaycastCollideHorizontal(RaycastDirection direction)
    {
        Ray wallRay_T, wallRay_B, wallRay_M;

        if (direction == RaycastDirection.Right)
        {
            wallRay_T = new Ray(transform.position + wallRayTopOffset, Vector3.right);
            wallRay_M = new Ray(transform.position, Vector3.right);
            wallRay_B = new Ray(transform.position + wallRayBottomOffset, Vector3.right);
        }
        else if (direction == RaycastDirection.Left)
        {
            wallRay_T = new Ray(transform.position + wallRayTopOffset, Vector3.left);
            wallRay_M = new Ray(transform.position, Vector3.left);
            wallRay_B = new Ray(transform.position + wallRayBottomOffset, Vector3.left);
        }
        else
        {
            Debug.Log("RaycastCollideHorizontal() BAD DIRECTION");
            return true;
        }

        RaycastHit wallHit;
        if (Physics.Raycast(wallRay_T, out wallHit, collider.bounds.extents.x + .1f))
        {
            if (wallHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Right)
                    transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                else if (direction == RaycastDirection.Left)
                    transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);

                return true;
            }
        }
        else if (Physics.Raycast(wallRay_M, out wallHit, collider.bounds.extents.x + .1f))
         {
             if (wallHit.collider.gameObject.CompareTag("Solid"))
             {
                 if (direction == RaycastDirection.Right)
                     transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                 else if (direction == RaycastDirection.Left)
                     transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);

                 return true;
             }
         }
        else if (Physics.Raycast(wallRay_B, out wallHit, collider.bounds.extents.x + .1f))
        {
            if (wallHit.collider.gameObject.CompareTag("Solid"))
            {
                if (direction == RaycastDirection.Right)
                    transform.position = new Vector3(wallHit.point.x - collider.bounds.extents.x, transform.position.y, 0);
                else if (direction == RaycastDirection.Left)
                    transform.position = new Vector3(wallHit.point.x + collider.bounds.extents.x, transform.position.y, 0);

                return true;
            }
        }
        return false;
    }
Example #14
0
 void WallDisplace(RaycastDirection dir, Vector3 collisionPt)
 {
     Vector3 displaceDir = DisplaceDirection(dir);
 }
Example #15
0
 /// <summary>
 /// Return if a raycast hit is occuring at raycastPos in raycastDir and assign to wallHits
 /// based on position and direction enum values.
 /// </summary>
 /// <param name="raycastPos">position raycast is being cast from; either head, core, or groin area on player.</param>
 /// <param name="raycastDir">Direction from raycastPos to cast from; based on one of eight core directions.</param>
 /// <param name="position">Enum representing where from player to raycast from; used for assigning to wallHits</param>
 /// <param name="direction">Enum representing which direction to raycast out; used for assigning to wallHits</param>
 /// <returns>true if a raycast hit occurs, false if not.</returns>
 bool Raycast(Vector3 raycastPos, Vector3 raycastDir, RaycastPosition position, RaycastDirection direction)
 {
     return(Physics.Raycast(raycastPos, raycastDir, out wallHits[8 * (int)position + (int)direction], width + collisionPadding, groundLayer));
 }