/// <summary>
        /// поставить шар на поле
        /// </summary>
        /// <param name="toBall"></param>
        /// <param name="atPosition"></param>
        /// <param name="type"></param>
        public void ConnectBall(BallConnected toBall, Vector2 atPosition, BallType type)
        {
            Vector2       ballPosition = toBall.transform.position;
            float         hitAngle     = Vector2.SignedAngle(Vector2.up, (ballPosition - atPosition).normalized);
            Vector2Int    gridPos      = GetNeighboorGridCellByAngle(toBall.GridPos, hitAngle);
            BallConnected newBall      = Instantiate(ballPref, GetOffsetByGridPos(gridPos),
                                                     Quaternion.identity, startSpawn);

            newBall.ChangeType(type);
            newBall.SetOnGrid(gridPos);
            allBalls.Add(gridPos, newBall);
            StartPopSequence(newBall);
            _gameController.LoadBall();
        }
        /// <summary>
        /// Пробить шар насквозь и занять его место
        /// </summary>
        /// <param name="ballConnected"></param>
        public void SmackBall(BallConnected ballConnected, BallType newType)
        {
            ballConnected.PopBall();
            RemoveBall(ballConnected);

            BallConnected newBall = Instantiate(ballPref, GetOffsetByGridPos(ballConnected.GridPos),
                                                Quaternion.identity, startSpawn);

            newBall.ChangeType(newType);
            newBall.SetOnGrid(ballConnected.GridPos);
            allBalls.Add(ballConnected.GridPos, newBall);

            StartPopSequence(newBall);
            _gameController.LoadBall();
        }
        /// <summary>
        /// Создать поле шаров
        /// </summary>
        /// <returns></returns>
        public Dictionary <Vector2Int, BallConnected> GenerateBalls()
        {
            allBalls = new Dictionary <Vector2Int, BallConnected>();
            var           textFile = Resources.Load <TextAsset>(levelName);
            List <string> lines    = new List <string>(textFile.text.Split('\n'));

            for (int l = 0; l < lines.Count; l++)
            {
                string line = lines[l];
                for (int i = 0; i < line.Length; i++)
                {
                    if (Char.GetNumericValue(line[i]) >= 0)
                    {
                        BallConnected newBall = Instantiate(ballPref, GetOffsetByGridPos(new Vector2Int(i, l)), Quaternion.identity, startSpawn);
                        newBall.name = i + "," + l;
                        Vector2Int gridPos = new Vector2Int(i, l);
                        newBall.SetOnGrid(gridPos);
                        if (l == 0)
                        {
                            newBall.HangUp();
                            minHangBalls++;
                        }
                        newBall.ChangeType(loadBallTypes[Int32.Parse(line[i].ToString())]);
                        allBalls.Add(gridPos, newBall);
                    }
                }
            }

            foreach (var ball in allBalls)
            {
                if (FindNeighboors(ball.Value.GridPos).Any(b => b.Hanging))
                {
                    ball.Value.HangUp();
                }
            }

            minHangBalls *= 0.3f;
            return(allBalls);
        }