/// <summary> /// Corotina responsável por apresentar um novo pedido, atualizando o tempo decorrido. /// </summary> /// <param name="pedido">Pedido que será mostrado</param> /// <returns></returns> public IEnumerator MostrarPedido(Pedido pedido) { //Instancia o prefab do objeto e o adiciona no PainelPedido para mostrar o pedido ao jogador. var prefPedido = Instantiate(Resources.Load <GameObject>("Prefabs/Pedido"), MyCanvas.PainelPedido); prefPedido.GetComponentsInChildren <Text>()[0].text = "Pedido\n" + pedido.objetoNecessario.nome; //Iteração que atualizará o tempo decorrido de acordo com a necessidade. for (int i = 0; i <= pedido.tempoDeEspera; i++) { if (pedidosAndamento.Contains(pedido) && FaseController.IsFaseRodando()) { prefPedido.GetComponentsInChildren <Text>()[1].text = pedido.tempoDecorrido + "/" + pedido.tempoDeEspera; pedido.tempoDecorrido = i; yield return(new WaitForSeconds(1f)); } else { break; } } if (FaseController.IsFaseRodando()) { //Quando chega ao fim do tempo do tempo decorrido, remove o pedido da lista de pedidos em andamento e o apaga do PainelPedidos. pedidosAndamento.Remove(pedido); MyCanvas.ApagarFilhoPainelPedido(pedido.objetoNecessario.nome); } }
/// <summary> /// Método FixedUpdate para verificação de cada quadro /// </summary> protected virtual void FixedUpdate() { if (FaseController.IsFaseRodando()) { Mover(); } }
/// <summary> /// Permite que o personagem que entrar dentro do Trigger do SphereCollider faça uma interação. /// </summary> /// <param name="other">Outro GameObject que estiver colidindo</param> protected virtual void OnTriggerEnter(Collider other) { if (other.GetComponent <Personagem>() != null && FaseController.IsFaseRodando()) { Personagem = other.GetComponent <Personagem>(); if (Input.GetKeyDown(Personagem.botaoInteracao)) { OnInteragiu.Invoke(null); } } }
/// <summary> /// Sobrecarga do método de interação do Interavel. O motivo da sobrecarga é em função da necessidade de manter o botão apertado durante a interação. /// </summary> /// <param name="collider">Colisor de outro GameObject que estiver colidindo</param> protected override void OnTriggerStay(Collider collider) { if (collider.GetComponent <Personagem>() != null && FaseController.IsFaseRodando()) { Personagem = collider.GetComponent <Personagem>(); if (Input.GetKey(Personagem.botaoInteracao)) { OnInteragiu.Invoke(null); } } }
/// <summary> /// Corotina que gera um novo pedido em um determinado periodo de tempo. /// </summary> /// <returns></returns>; public IEnumerator GeraPedido() { if (FaseController.IsFaseRodando()) { //Instancia um pedido e o adiciona na lista de pedidos em andamento. Pedido p = InstanciaPedido(); if (p != null) { pedidosAndamento.Add(p); StartCoroutine(MostrarPedido(p)); //Espera os segundos determinados no Inspector. yield return(new WaitForSeconds(tempoNovoPedido)); //Quando termina essa corotina, uma nova entra em execução para gerar outros pedidos. StartCoroutine(GeraPedido()); } } }
/// <summary> /// Corotina responsável pelo efeito de manipulação de objetos. Apenas uma corotina Manipular pode ser executada por vez. /// </summary> /// <returns></returns> public IEnumerator Manipular() { //Adiciona o estado EmManipulação para o objeto e mostra a BarraFornalha como uma barra de progresso. Debug.Log("Manipulando..."); objeto.estadoObj = objeto.estadoObj != EstadoObjeto.PassouDoPonto ? EstadoObjeto.EmManipulacao : EstadoObjeto.PassouDoPonto; MyCanvas.BarraFornalha.gameObject.SetActive(true); MyCanvas.BarraFornalha.maxValue = objeto.tempoParaFicarPronto; //Loop para manipular um objeto, usando o campo 'tempoParaFicarPronto' como condição para finalização. for (float i = objeto.tempoDecorrido; objeto != null && i <= objeto.tempoParaFicarPronto; i += 0.01f) { //Verifica se o manipulador esteja ativado. Caso ele tenha sido desativado em algum momento, para a iteração. if (!isManipulando || !FaseController.IsFaseRodando()) { break; } //Seta o tempo decorrida da manipulação, assim como o valor da fornalha. objeto.tempoDecorrido = i; MyCanvas.BarraFornalha.value = i; //Espera por 0.01 segundos antes de ir para a próxima iteração. yield return(new WaitForSeconds(0.01f)); } //Verifica se existe um objeto no Manipulador. if (objeto != null && FaseController.IsFaseRodando() && objeto.estadoObj != EstadoObjeto.PassouDoPonto) { if (TutorialController.isEsperandoManipular) { TutorialController.MostrarManipulouObjeto(); } //Se tiver, verifica se ele pode ser Aperfeiçoavel. if (objeto is ObjetoAperfeicoavel && objeto.estadoObj != EstadoObjeto.Pronto) { //Caso possa aperfeiçoar, adicionar o estado PreparadoParaAperfeicoar. objeto.estadoObj = EstadoObjeto.PreparadoParaAperfeicoar; } else { //Caso não possa aperfeiçoar, deixe o objeto como Pronto. objeto.estadoObj = EstadoObjeto.Pronto; } } bool passouPonto = false; if (objeto != null && objeto.estadoObj != EstadoObjeto.PassouDoPonto) { //Cria uma variável que verifica se o objeto passou do ponto, e espera um tempo para verificar se o objeto realmente passará do ponto. passouPonto = true; for (float i = 0; i < tempoPassarPonto; i += 0.01f) { if (!isManipulando || !FaseController.IsFaseRodando() || objeto != null) { passouPonto = false; break; } MyCanvas.BarraFornalha.value = objeto.tempoParaFicarPronto; MyCanvas.BarraFornalha.GetComponent <Animator>().SetBool("IsPassandoPonto", true); yield return(new WaitForSeconds(0.01f)); } } //Verifica se existe um objeto no Manipulador e o coloca como Passado do Ponto. if (objeto != null && FaseController.IsFaseRodando() && passouPonto) { if (Camera.main.GetComponent <TutorialController>() != null) { TutorialController.MostrarObjetoPassouPonto(); } objeto.estadoObj = EstadoObjeto.PassouDoPonto; } if (objeto != null && objeto.estadoObj == EstadoObjeto.PassouDoPonto) { MyCanvas.BarraFornalha.GetComponent <Animator>().SetTrigger("PassouPonto"); } MyCanvas.BarraFornalha.GetComponent <Animator>().SetBool("IsPassandoPonto", false); //Avisa que o Manipulador não está mais em uso. isManipulando = false; }