private HexagonController GetHexagon(Vector3 offset, int hexagonsDistance)
    {
        offset *= (HexagonController.DISTANCE_BETWEEN_HEXAGONS * hexagonsDistance);
        Vector3 position = headTrf.position + offset;

        position.y = 0;

        Collider[] colliders = Physics.OverlapSphere(position, HexagonController.DISTANCE_BETWEEN_HEXAGONS, HexagonController.hexagonLayer);

        if (colliders.Length == 0)
        {
            return(null);
        }

        HexagonController result        = null;
        float             distanceDelta = float.MaxValue;

        for (int i = 0; i < colliders.Length; ++i)
        {
            HexagonController candidate = colliders[i].GetComponent <HexagonController>();

            if (candidate.CanExitWorm())
            {
                if (result == null)
                {
                    result        = candidate;
                    distanceDelta = (colliders[i].transform.position - position).sqrMagnitude;
                }
                else
                {
                    float newDistance = (colliders[i].transform.position - position).sqrMagnitude;

                    if (newDistance < distanceDelta)
                    {
                        result        = candidate;
                        distanceDelta = newDistance;
                    }
                }
            }
        }

        return(result);
    }
    protected HexagonController GetHexagonFacingCenter(HexagonController origin, int hexagonsDistance = 5)
    {
        Vector3 offset;

        //Special case if origin hexagon is the center one
        if (origin.transform.position == bb.sceneCenter.transform.position)
        {
            float angle = Random.Range(0f, 365f);
            offset = Quaternion.Euler(0, angle, 0) * Vector3.forward;
            offset = offset * HexagonController.DISTANCE_BETWEEN_HEXAGONS * hexagonsDistance;
        }
        else
        {
            offset   = (bb.sceneCenter.transform.position - origin.transform.position);
            offset.y = 0;
            offset   = offset.normalized * HexagonController.DISTANCE_BETWEEN_HEXAGONS * hexagonsDistance;
        }

        Vector3 position = origin.transform.position + offset;

        position.y = 0;

        Collider[] colliders = Physics.OverlapSphere(position, HexagonController.DISTANCE_BETWEEN_HEXAGONS, HexagonController.hexagonLayer);

        if (colliders.Length == 0)
        {
            return(null);
        }

        HexagonController result         = null;
        float             targetDistance = Mathf.Pow(hexagonsDistance * HexagonController.DISTANCE_BETWEEN_HEXAGONS, 2);
        float             distanceDelta  = targetDistance;

        for (int i = 0; i < colliders.Length; ++i)
        {
            HexagonController candidate = colliders[i].GetComponent <HexagonController>();

            if (candidate.CanExitWorm())
            {
                if (result == null)
                {
                    result = candidate;
                    float distance = (colliders[i].transform.position - position).sqrMagnitude;
                    distanceDelta = Mathf.Abs(targetDistance - distance);
                }
                else
                {
                    float newDistance      = (colliders[i].transform.position - position).sqrMagnitude;
                    float newDistanceDelta = Mathf.Abs(targetDistance - newDistance);

                    if (newDistanceDelta < distanceDelta)
                    {
                        result        = candidate;
                        distanceDelta = newDistanceDelta;
                    }
                }
            }
        }

        return(result);
    }