private void SetLayerTo(int newLayer)
 {
     standing = true;
     if (newLayer != currentLayer)
     {
         //handle move to new layer
         LayerDependantTracker.RemoveObjectFromLayer(gameObject, currentLayer);
         currentLayer = newLayer;
         LayerDependantTracker.AddObjectToLayer(gameObject, newLayer);
     }
 }
    void FixedUpdate()
    {
        Vector2 grav = gameObject.GetComponent <GravityManager>().GetGravityVector2();

        position2D = new Vector2(transform.position.x, transform.position.y);

        transformUp    = new Vector2(-grav.x, -grav.y);
        transformRight = new Vector2(-grav.y, grav.x);

        DoubleRaycastDownToGround(groundRayLength, collisionLayerMask, groundHitInfo);
        DoubleRaycastDownToRight(rightRayLength, collisionLayerMask, out RaycastHit2D rightLeftHitInfo, out RaycastHit2D rightRightHitInfo);
        DoubleRaycastDownToLeft(leftRayLength, collisionLayerMask, out RaycastHit2D leftLeftHitInfo, out RaycastHit2D leftRightHitInfo);
        DoubleRaycastDownToCeiling(ceilingRayLength, collisionLayerMask, out RaycastHit2D ceilingLeftHitInfo, out RaycastHit2D ceilingRightHitInfo);

        //tracks the most recent layer we collided with
        int recentHitLayer = 0;

        standing = false;

        int groundHitCount = 0;

        foreach (var hit in groundHitInfo)
        {
            if (hit)
            {
                recentHitLayer = hit.transform.gameObject.layer;
                groundHitCount++;
            }
        }

        if (groundHitCount > numberOfRay * 0.5f)
        {
            onGround = true;
            SetLayerTo(recentHitLayer);
        }
        else
        {
            onGround = false;
        }

        if (ceilingLeftHitInfo && ceilingRightHitInfo)
        {
            onCeiling = true;
            SetLayerTo(ceilingLeftHitInfo.transform.gameObject.layer);
        }
        else
        {
            onCeiling = false;
        }

        if (rightLeftHitInfo || rightRightHitInfo)
        {
            onRightWall = true;
            RaycastHit2D correctHitInfo = rightLeftHitInfo ? rightLeftHitInfo : rightRightHitInfo;
            SetLayerTo(correctHitInfo.transform.gameObject.layer);
        }
        else
        {
            onRightWall = false;
        }

        if (leftLeftHitInfo || leftRightHitInfo)
        {
            onLeftWall = true;
            RaycastHit2D correctHitInfo = leftLeftHitInfo ? leftLeftHitInfo : leftRightHitInfo;
            SetLayerTo(correctHitInfo.transform.gameObject.layer);
        }
        else
        {
            onLeftWall = false;
        }

        onWall = onLeftWall || onRightWall;

        if (onGround && onLeftWall)
        {
            correctVector2 = (leftLeftHitInfo.point -
                              (position2D - transformUp * leftRayOffsetBottom + leftRayLength * -transformRight));
        }

        //if we're no longer standing, remove ourselves from the current layer
        if (standing == false && currentLayer != 0)
        {
            LayerDependantTracker.RemoveObjectFromLayer(gameObject, currentLayer);
            currentLayer = 0;
        }

        Debug.DrawRay(transform.position, transform.forward, Color.black, 5f);
    }