void ResolveCollisions(RaycastHit2D hit, CollisionType collisionType, ref Vector2 velocity, float moveDir, ref float rayLength)
    {
        collisions.collided = true;

        if (collisionType == CollisionType.HORIZONTAL && hit.distance == 0)
        {
            if (hit.transform.tag != "Hazard")
            {
                return;
            }
        }

        if (hit.transform.tag != "Gravity Switch")
        {
            if (!canFlipGravity)
            {
                canFlipGravity = true;
            }
        }

        switch (hit.transform.tag)
        {
        case "Hazard":
            if (!collisions.hitHazard)     //fix after making collisions end after 1 ray... doesn't really make sense to continue w/o slopes
            {
                if (!invincible)
                {
                    OnHazard();
                    collisions.hitHazard = true;
                }
            }
            break;

        case "Powerup":
            Powerup pw = hit.collider.GetComponent <Powerup>();
            powerups.AddLast(pw.GetPowerupType());
            if (powerups.Count > powerupSize && !greedy)
            {
                powerups.RemoveFirst();
            }
            UpdatePowerupUI();
            pw.Consume();
            return;

        case "Goal":
            EntityManager.instance.levelComplete = true;
            hit.collider.GetComponent <Goal>().GoalComplete();
            return;

        case "Through":
            if (collisionType == CollisionType.VERTICAL)
            {
                if (moveDir == 1 || hit.distance == 0 || userInput.y == -1)     //watch for bugs from removing fallingThroughPlat, invoke after .5 sec delay (seblague)
                {
                    return;
                }
                break;
            }
            else
            {
                return;
            }

        case "Yoku":
            if (collisionType == CollisionType.VERTICAL)
            {
                if (hit.distance == 0)
                {
                    return;
                }
            }
            break;

        case "Ice":
            if (collisionType == CollisionType.VERTICAL)
            {
                groundAcceleration = 0.75f;
            }
            break;

        case "Gravity Switch":
            if (canFlipGravity)
            {
                FlipGravity();
                canFlipGravity = false;
                return;
            }
            else
            {
                return;
            }

        case "Entity Switch":
            hit.collider.GetComponent <Switch>().Consume();
            return;

        case "Quicksand":
            inQuicksand = true;
            return;

        case "Water":
            if (!inWater)
            {
                inWater         = true;
                this.velocity.y = Mathf.Clamp(this.velocity.y, -2f, 10f);
            }
            collisions.collidedWater = true;
            return;

        case "Checkpoint":
            spawnPoint = hit.transform.position;
            hit.collider.GetComponent <Goal>().GoalComplete();
            return;

        default:
            break;
        }

        if (collisionType == CollisionType.VERTICAL)
        {
            velocity.y = (hit.distance - SKIN_WIDTH) * moveDir;
            rayLength  = hit.distance;

            if (!gravityFlipped)
            {
                collisions.below = moveDir == -1;
                collisions.above = moveDir == 1;
            }
            else
            {
                collisions.below = moveDir == 1;
                collisions.above = moveDir == -1;
            }
        }
        else
        {
            velocity.x = Mathf.Min(Mathf.Abs(velocity.x), (hit.distance - SKIN_WIDTH)) * moveDir;
            rayLength  = Mathf.Min(Mathf.Abs(velocity.x) + SKIN_WIDTH, hit.distance);

            collisions.left  = moveDir == -1;
            collisions.right = moveDir == 1;
        }
    }