private void Awake() { if (Instance == null) { Instance = this; } else if (Instance != this) { Destroy(gameObject); } }
// Обнуление буквы перед уборкой в пул private void HideLetterInPool() { GameManager.EndPointGenerationEvent -= HideLetterInPool; GameManager.StartGameEvent -= StartMovingFromHeader; GameManager.ShuffleLettersEvent -= ChangePosition; GameManager.CorrectButtonClickedEvent -= OtherCorrectButtonClicked; GameManager.WrongButtonClickedEvent -= OtherWrongButtonClicked; GameManager.EndGameEvent -= HideLetterInPool; boxCollider.enabled = false; // Обнуляем и возвращаем объект в пул LettersPool.ReturnLetterInPool(this); }
// Создавание и расстановка букв и их теней (белые образы букв) private void SpawnHeaderLettersAndShadows(Letter gameLetter) { spawnPointsInHeader = GenerateHeaderPositions(fonts.Count); for (int i = 0; i < fonts.Count; i++) { // Размещение "тени" буквы var letterShadow = LettersPool.SpawnLetterObject(); letterShadow.GetComponent <LetterController>().SetupLetter(gameLetter, fonts[i], halfLetterSize, spawnPointsInHeader[i], headerPanel, LetterController.LetterType.LetterShadow); // Размещение буквы var letter = LettersPool.SpawnLetterObject(); letter.GetComponent <LetterController>().SetupLetter(gameLetter, fonts[i], halfLetterSize, spawnPointsInHeader[i], gameZonePanel, LetterController.LetterType.CorrectLetter); } }
// Генерация позиций для букв на поле private void GenerateGameZonePositions() { // Получаем точки углов зоны для букв (в экранных координатах) Rect gameZoneWorldRect = GetWorldRectCorners(gameZonePanel.GetComponent <RectTransform>()); List <Vector3> generatedPositions = new List <Vector3>(); for (int i = 0; i < 100; i++) { // Случайная позиция на экране с учетом размера буквы Vector3 randPosition = new Vector3(Random.Range(gameZoneWorldRect.xMin + halfLetterSize.x * canvasScale, gameZoneWorldRect.xMax - halfLetterSize.x * canvasScale), Random.Range(gameZoneWorldRect.yMin + halfLetterSize.y * canvasScale, gameZoneWorldRect.yMax - halfLetterSize.y * canvasScale), 0); // Пускаем OverlapBox, если место свободно, то создаем точку для буквы if (ChekAvailableSpace(randPosition)) { generatedPositions.Add(randPosition); var collider = LettersPool.SpawnLetterObject(); collider.GetComponent <LetterController>().SetupLetterAsCollider(halfLetterSize, randPosition); } } // Убираем коллайдеры с поля EndPointGenerationEvent?.Invoke(); // Если создали меньше позиций чем было, то делаем перегенерацию if (spawnPositionsCount > generatedPositions.Count) { GenerateGameZonePositions(); return; } spawnPointsInGameZone.Clear(); // Урезаем максимальное число сгенерированных первый раз позиций на 10%. Иначе можно сгенерировать идеальный вариант на повторное достижение которого нужно будет очень большое количество перегенераций. if (spawnPositionsCount == 0) { spawnPositionsCount = generatedPositions.Count - (int)(generatedPositions.Count * 0.1); } // Сохраняем получившееся значение точек spawnPointsInGameZone = generatedPositions.GetRange(0, spawnPositionsCount); // Создаем лист свободных позиций freeSpawnPointsInGameZone.Clear(); freeSpawnPointsInGameZone = new List <Vector3>(spawnPointsInGameZone); // Перемешиваем лист ListShuffle(freeSpawnPointsInGameZone); }
// заполнение поля неправильными буквами private IEnumerator SpawnWrongLetters(Letter gameLetter) { Vector3 spawnPosition = new Vector3(); // Заполняем пока есть свободные позиции while (freeSpawnPointsInGameZone.Count > 0) { GetFreeSpawnPosition(ref spawnPosition); // Размещение неправильной буквы var wrongLetter = LettersPool.SpawnLetterObject(); wrongLetter.GetComponent <LetterController>().SetupLetter(rusAlphabet.GetRandomWrongLetter(gameLetter), fonts[Random.Range(0, fonts.Count)], halfLetterSize, spawnPosition, gameZonePanel, LetterController.LetterType.WrongLetter); yield return(new WaitForEndOfFrame()); } }