private void Awake() { player = GameObject.FindGameObjectWithTag("Player"); head = GameObject.FindGameObjectWithTag("DragonHead"); agent = GetComponent <NavMeshAgent>(); animator = GetComponent <Animator>(); dragonHead = head.GetComponent <DragonHead>(); blood = GameObject.FindGameObjectWithTag("DragonParticles").GetComponent <ParticleSystem>(); var audio = GetComponents <AudioSource>(); stepsAudioSource = audio[0]; breathingAudioSource = audio[1]; attackAudioSource = audio[2]; }
// перезапус розыгрыша public void reStart() { var ticketHolder = main.ticketHolder; var gameMode = main.gameMode; var receivingTray = main.receivingTray; startCheckTime = -1.0f; DragonHead.close(true); ticketHolder.removeAllTickets(); receivingTray.removeAllBalls(); receivingTray.resetBalls(); //main.templatesHolder.expectedWin.setValue(0); getDrum().state = Drum.State.START; // устарелая логика для одиночной игры(которая уже никогда не используется), и после для мультиплеерной if ((gameMode == GameMode.JSON_FILE || gameMode == GameMode.JSON_FILE_IN_ANDROID || gameMode == GameMode.CLIENT_GENERATE)) { main.jsonHandler.getNextRuffle(); print("█ Warnign! GameMode == " + gameMode); setState(RaffleState.WAIT); } else if (gameMode == GameMode.SERVER) { PlayEvent.OnPlay(); main.handlerServerData.startNewRaffle(); if (main.templatesHolder != null && main.templatesHolder.expectedWin != null) { if (main.templatesHolder.expectedWin.getValue() != 0) { main.templatesHolder.expectedWin.setValue(0); } } setState(RaffleState.WAIT_SERVER_DATA); } else { print("Error! [reStart] unknown GameMode:" + gameMode); } }
int fixedPause = 0; // фиксированя пауза, перед открытием пасти ( забыл зачем нужен этот костыль ) // ряд процессов описаные внутри void FixedUpdate() { if (tag != "ReceivingTrayBall") { return; // Вся логика ниже описанна только для шаров из лотка } if (DragonHead.isFullOpen()) // если пасть дракона открылась полностью и нужно высыпать шары { if (fixedPause++ > 10) { fixedPause = 0; } else { return; // пауза... } float py = transform.localPosition.y; if (py >= 2.0f && py <= 3.0f) // глядя на позиции определяем местонахождения шара ( в нижней части лотка или верхней ) и толкание их в соответственном направлении { m_rigibody.velocity = new Vector3(-5.0f, 0.0f); // влево } else if (py <= -3.0f && py >= -3.8) { m_rigibody.velocity = new Vector3(5.0f, 0.0f); // вправо } else if (py < -5.0f) { Destroy(gameObject); // если наш шар ниже экрана можем удалять } return; } else if (aligned) { return; // окончательный возможный стейт, после которого ничего не должно происходить } if (m_rigibody == null) { return; } // фиксация скорости шара для корректной постройки траектории вылетающих звёзд if (lastFixedVelocityTime + timeDelayForPrevVelocity < Time.time) { for (int i = 1; i < lenHistorySpeed; i++) { prevVelocity[i] = prevVelocity[i - 1]; } prevVelocity[0] = m_rigibody.velocity; lastFixedVelocityTime = Time.time; } // дополнительные действия в зависимости от стейта, оказались куда менее чем ожидалось... switch (state) { case BallState.ROLL: break; case BallState.STOP: break; case BallState.ALIGNING: { // крутим шар, ставим ровно float rZ = transform.localRotation.z; if (Mathf.Abs(rZ) > speedAlignRotation * 0.02f) { transform.Rotate(new Vector3(0.0f, 0.0f, (rZ > 0) ? -speedAlignRotation : speedAlignRotation)); } else { //GetComponent<SpriteRenderer>().color = Color.yellow; setState(BallState.STOP); aligned = true; } } break; case BallState.FLY_TO: { } break; } }
// ряд операций, при смене на соответсвующий стейт public void setState(RaffleState newState) { //print("[setState] newState: " + newState); switch (newState) { case RaffleState.WAIT: { if (main.gameMode != GameMode.SERVER) { main.changeNameBtnOn("Restart", "Start"); main.setEnableBtn("Start", true); main.setEnableBtn("BuyTicket", true); //main.setCaptionBtn("BuyTicket", "Buy Ticket: " + MAIN.ticketCost.ToString()); //main.setCaptionBtn("BuyBall", "Buy Ball: " + MAIN.ballCost1x.ToString()); } main.setEnableBtn("Restart", true); //main.setEnableBtn("BuyBallBtn", false); } break; case RaffleState.WAIT_SERVER_DATA: { main.setEnableBtn("Restart", false); main.setEnableBtn("Start", false); //main.setEnableBtn("BuyBallBtn", false); main.setEnableBtn("BuyTicket", false); } break; case RaffleState.PROCEED: { main.changeNameBtnOn("Start", "Restart"); main.setEnableBtn("BuyTicket", false); //Tutorial.show(TutorialSubject.TS_TEMPLEATES); } break; case RaffleState.FINISHED: { //HUD.setEnableBackButton(true); //if (main.handlerServerData.isAvailableNextBall) HUD.showBuyBallBtn(); } break; case RaffleState.ADDITIONAL_BALL: { startCheckTime = Time.time; DragonHead.openMore(); } break; case RaffleState.FINISH: { //Tutorial.show(TutorialSubject.TS_BUY_GOLD_BTN); getDrum().state = Drum.State.STOPING; HUD.setEnableBackButton(true); if (main.handlerServerData.isAvailableNextBall) { HUD.showBuyBallBtn(); var flickering = Flickering.set(HUD.getBuyBallButton().gameObject, 1.5f); // #V мигание кнопки докупки шаров flickering.setFlickeringUntilPress(); } else { var flickering = Flickering.set(HUD.getBackButton().gameObject, 1.5f); // #V мигание кнопки выхода flickering.setFlickeringUntilPress(); DragonHead.openFull(); main.receivingTray.setGravityForBalls(10); TicketsHolder.startHideTickets(); } Utils.screenShot("OnFinishRaffle.png"); // только в режиме тестировки } break; } raffleState = newState; }