// TODO Bounds from mesh
//        Bounds CalculateFromMesh(Mesh mesh)
//        {
//            if (aObj == null)
//            {
//                Debug.LogError("CalculateBoundingBox: object is null");
//                return new Bounds(Vector3.zero, Vector3.one);
//            }
//            Transform myTransform = aObj.transform;
//            Mesh mesh = null;
//            MeshFilter mF = aObj.GetComponent<MeshFilter>();
//                if (mF != null)
//                mesh = mF.mesh;
//                else
//            {
//                SkinnedMeshRenderer sMR = aObj.GetComponent<SkinnedMeshRenderer>();
//                if (sMR != null)
//                    mesh = sMR.sharedMesh;
//            }
//        if (mesh == null)
//        {
//        Debug.LogError("CalculateBoundingBox: no mesh found on the given object");
//        return new Bounds(aObj.transform.position, Vector3.one);
//        }
//        Vector3[] vertices = mesh.vertices;
//        if (vertices.Length <=0)
//        {
//        Debug.LogError("CalculateBoundingBox: mesh doesn't have vertices");
//        return new Bounds(aObj.transform.position, Vector3.one);
//        }
//        Vector3 min, max;
//        min = max = myTransform.TransformPoint(vertices[0]);
//        for (int i = 1; i < vertices.Length; i++)
//        {
//        Vector3 V = myTransform.TransformPoint(vertices[i]);
//            for (int n = 0; n < 3; n++)
//        {
//            if (V[n] > max[n])
//                max[n] = V[n];
//            if (V[n] < min[n])
//                min[n] = V[n];
//        }
//        }
//        Bounds B = new Bounds();
//        B.SetMinMax(min, max);
//        return B;
//        }

        private void CheckSurround(Vector2 wdir)
        {
            var        pos = _collider.transform.position + Vector3.up;
            RaycastHit rayhit;

            for (int i = 1, n = _sides.Length; i < n; i++)
            {
                if (!UnityEngine.Physics.Raycast(pos, _collider.transform.TransformDirection(_sides[i]), out rayhit, 2, _movementMask))
                {
                    continue;
                }


                if (rayhit.distance < 1f)
                {
                    OnWallClose?.Invoke(i);

                    if (i == 2) // forward
                    {
                        CheckWallHeigt(rayhit);
                    }

                    Debug.DrawLine(pos, rayhit.point, Color.red);
                    return;
                }
                else
                {
                    Debug.DrawLine(pos, rayhit.point, Color.blue);
                }
            }

            OnWallClose?.Invoke(0);
        }
        private void CheckSurround(Vector2 wdir)
        {
            Vector2 pos = new Vector2(_collider.transform.position.x, _collider.transform.position.y) + Vector2.up;

            _wall = 0;
            for (int i = 1, n = _sides.Length; i < n; i++)
            {
                var dir    = _collider.transform.TransformDirection(_sides[i]);
                var rayhit = Physics2D.Raycast(pos, new Vector2(dir.x, dir.y), _radius * 5, _movementMask);

                if (rayhit.collider == null)
                {
                    continue;
                }

                _wall         = i;
                _wallDistance = rayhit.distance;
                if (rayhit.distance <= _radius * 1.1f)
                {
                    OnWallClose?.Invoke(i);

                    var heigt = CheckWallHeigt(rayhit);

                    // Set position
                    //_collider.transform.position = new Vector3( rayhit.point.x - _radius * _sides[i].x, Collider.transform.position.y, Collider.transform.position.z );

                    Debug.DrawLine(pos, rayhit.point, Color.red);
                    Debug.DrawRay(pos, Vector2.up * heigt, Color.blue);
                    return;
                }
                else
                {
                    Debug.DrawLine(pos, rayhit.point, Color.blue);
                }
            }

            OnWallClose?.Invoke(0);
        }