private void Screamer(PositionInfo positionInfo, Transform monsterTransform) { GameController.playerLose = true; MonsterTools.UsePositionInfo(positionInfo, monsterTransform, monsterAnim); meshObject.enabled = true; ScreamerEffect(); }
protected IEnumerator MonsterEmergence(PositionInfo[] positionInfo) { meshObject = monsterModel.GetComponent <SkinnedMeshRenderer>(); monsterTransform = gameObject.GetComponent <Transform>(); //Кешируем Transform monsterAnim = monsterAnimHandler.GetComponent <Animation>(); meshObject.enabled = !meshObject.enabled; //Выключаем модель монстра while (!monsterOver) { bool isForcedAppearNeeded = false; for (int i = 0; i < (generalTime * Tools.chekerIECoeficient); i++) //Ждем появления монстра { if (SafeTimeCondition(ref isForcedAppearNeeded)) //Запускаем отсчет появления заново, если игрок выполнил нужное условие { i = 0; } if (isForcedAppearNeeded) //Прерываем цикл, если выполнено условие внезапного появления { break; } timeToAppear = (generalTime - i / Tools.chekerIECoeficient); //Записываем время до появление монстра в публичную переменную yield return(new WaitForSeconds(1 / Tools.chekerIECoeficient)); } positionKey = (monsterStadia * 3) + Random.Range(0, Tools.GetMaxValue(2)); //Умножаем на 3, ибо всего 3 стадии. generalTime = Random.Range(minTimeToAppear, Tools.GetMaxValue(maxTimeToAppear)); BasicAppearEffect(positionInfo[positionKey].soundNum); //Монстр появляется yield return(new WaitForSeconds(EyeBlinkController.halfTimeBlink)); //время, специально подобранное под анимацию моргания. Когда игрок ничего не видит, монстр появляется. MonsterTools.UsePositionInfo(positionInfo[positionKey], monsterTransform, monsterAnim); meshObject.enabled = !meshObject.enabled; //Монстр появляется bool pauseCycleNeeded = false; //Нужна ли пауза bool isConditionPerformedFlag = false; //Выполнено ли условие безопасного выхода for (int i = 0; i < waitingTime * Tools.chekerIECoeficient; i++) //Время ожидания монстра { if (StopWaitingTimeCondition(ref isConditionPerformedFlag, ref pauseCycleNeeded)) { break; //Прерываем счетчик } if (pauseCycleNeeded) //Приостанавливаем цикл ожидания, если необходима пауза { i = 0; } yield return(new WaitForSeconds(1 / Tools.chekerIECoeficient)); } BasicDisappearEffect(); //Монстр исчезает yield return(new WaitForSeconds(EyeBlinkController.halfTimeBlink)); meshObject.enabled = !meshObject.enabled; if (!isConditionPerformedFlag) //Если условие безопасного выхода не выполнено { if (monsterStadia >= 2) //Если стадия монстра выше/равна 2, игра закончена { monsterOver = !monsterOver; } else { waitingTime -= debuffWaitingTime; //В следующий раз время ожидания монстра сократится monsterStadia++; heartBitting.Play(); //Проигрываем звук сердцебиения } } } yield return(new WaitForSeconds(EyeBlinkController.halfTimeBlink)); //чтобы игрок не "проморгал" скример Screamer(positionInfo[screamerArrayPosition], monsterTransform); }