Exemplo n.º 1
0
    public bool HasDetectedPlayer()
    {
        CollisionOrientationInfo orientationInfo = new CollisionOrientationInfo();

        for (int j = 0; j < 2; j++)
        {
            orientationInfo.orientation = GetObjectOrientation();


            if (j == 0)
            {
                orientationInfo.sideDirection = 1;
            }
            else
            {
                orientationInfo.sideDirection = -1;
            }

            orientationInfo.rayLength = 0.25f;
            orientationInfo.SetInfoBasedOnOrientation();

            for (int i = 0; i < horizontalRayCount; i++)
            {
                //If we're moving left or if we're moving right
                Vector2 rayOrigin = (orientationInfo.sideDirection == -1) ? raycastOrigins.bottomLeft : raycastOrigins.bottomRight;
                rayOrigin += orientationInfo.rayOriginDirection * (horizontalRaySpacing * i);
                Ray2D collisionRay = new Ray2D(rayOrigin, orientationInfo.collisionRayDirection * orientationInfo.sideDirection);

                RaycastHit2D hit = Physics2D.Raycast(collisionRay.origin, collisionRay.direction, orientationInfo.rayLength, interactMask);
                Debug.DrawRay(collisionRay.origin, collisionRay.direction, Color.green, orientationInfo.rayLength);

                if (hit.transform != null)
                {
                    float distance = Vector2.Distance(hit.transform.position, this.transform.position);

                    if (distance > 0.80f)
                    {
                        return(true);
                    }
                }
            }
        }
        return(false);
    }
Exemplo n.º 2
0
    /// <summary>
    /// Based off of Horizontal Collisions from tutorial
    /// </summary>
    private void SideOfObjectCollisions(ref Vector3 velocity)
    {
        CollisionOrientationInfo orientationInfo = new CollisionOrientationInfo();

        orientationInfo.orientation = GetObjectOrientation();

        orientationInfo.sideDirection = Mathf.Sign(velocity.x);
        orientationInfo.rayLength     = Mathf.Abs(velocity.x) + skinWidth;

        orientationInfo.SetInfoBasedOnOrientation();

        int collisionCount = 0;

        for (int i = 0; i < horizontalRayCount; i++)
        {
            //If we're moving left or if we're moving right
            Vector2 rayOrigin = (orientationInfo.sideDirection == -1) ? raycastOrigins.bottomLeft : raycastOrigins.bottomRight;
            rayOrigin += orientationInfo.rayOriginDirection * (horizontalRaySpacing * i);
            Ray2D collisionRay = new Ray2D(rayOrigin, orientationInfo.collisionRayDirection * orientationInfo.sideDirection);

            RaycastHit2D hit = Physics2D.Raycast(collisionRay.origin, collisionRay.direction, orientationInfo.rayLength, collisionMask);
            //Debug.DrawRay(collisionRay.origin, collisionRay.direction, Color.red);

            if (hit.transform != null)
            {
                if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Platform"))
                {
                    velocity.x = (hit.distance - skinWidth) * orientationInfo.sideDirection;
                    orientationInfo.rayLength = hit.distance;

                    collisions.left  = orientationInfo.sideDirection == -1;
                    collisions.right = orientationInfo.sideDirection == 1;
                }
            }
        }
    }
    private void DetectedInteractable()
    {
        CollisionOrientationInfo orientationInfo = new CollisionOrientationInfo();

        orientationInfo.orientation = GetObjectOrientation();

        orientationInfo.sideDirection = Mathf.Sign(velocity.x);
        orientationInfo.rayLength     = 2 + skinWidth;

        orientationInfo.SetInfoBasedOnOrientation();

        //If we're moving left or if we're moving right
        Vector2 rayOrigin = (lastXInput == -1) ? raycastOrigins.bottomLeft : raycastOrigins.bottomRight;
        Vector2 rayOffset = (lastXInput == -1) ? new Vector2(-0.1f, -0.1f) : new Vector2(0.1f, 0.1f);

        rayOrigin += (orientationInfo.rayOriginDirection + rayOffset);
        Ray2D collisionRay = new Ray2D(rayOrigin, orientationInfo.collisionRayDirection * orientationInfo.sideDirection);

        RaycastHit2D hit = Physics2D.Raycast(collisionRay.origin, collisionRay.direction, orientationInfo.rayLength);

        Debug.DrawRay(collisionRay.origin, collisionRay.direction, Color.red);

        if (hit.transform != null)
        {
            if (lastInteractedObject == null || lastInteractedObject != hit.transform)
            {
                lastInteractedObject = hit.transform;
                playerController.SetInteractable(hit.transform.GetComponent <Interactable>());
                moveableObjectSide = lastXInput;
            }
        }
        else
        {
            playerController.SetInteractable(null);
        }
    }