1
resposta

Ativar coroutine 1x

O que você acha dessa forma de fazer?

Poderiamos guardar a coroutina EsperarEContinuarJogo em uma variavel. Verificamos se ela é null se for starta ela se não ignora.

ao final da chamada transforma ela em null.

Eu nao testei pra ver se funciona mas fico imaginando que se for dessa maneira não precisamos mexer no metodo parado pra adicionar o false/true na variavel booleana e nao precisariamos adicionar 2 ifs no update.

Essa solução seria válida?

1 resposta

Olá, José! Tudo bem?

Peço desculpas pela demora em obter um retorno.

A solução proposta de armazenar a coroutine em uma variável e verificar se ela é nula antes de iniciar pode ser uma abordagem válida. Isso evitaria a repetição do código nos métodos "ContinuarJogo" e "PararJogo" e removeria a necessidade dos dois ifs no método "Update".

Aqui está como poderia ser implementada essa solução:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ControleDePause : MonoBehaviour
{
    [SerializeField]
    private GameObject painelPause;
    [SerializeField, Range(0, 1)]
    private float escalaDeTempoDuranteOPause;

    private bool jogoEstaParado;
    private Coroutine coroutine;

    private void Update()
    {
        if (this.EstaoTocandoNaTela())
        {
            if (this.jogoEstaParado)
            {
                this.ContinuarJogo();
            }
        }
        else
        {
            if (!this.jogoEstaParado)
            {
                this.PararJogo();
            }
        }
    }

    private void ContinuarJogo()
    {
        if (coroutine == null)
        {
            coroutine = StartCoroutine(EsperarEContinuarOJogo());
        }
    }

    private IEnumerator EsperarEContinuarOJogo()
    {
        yield return new WaitForSecondsRealtime(0.2f);
        this.MudarEscalaDeTempo(1);
        this.painelPause.SetActive(false);
        this.jogoEstaParado = false;
        coroutine = null;
    }

    private void PararJogo()
    {
        this.painelPause.SetActive(true);
        this.MudarEscalaDeTempo(this.escalaDeTempoDuranteOPause);
        this.jogoEstaParado = true;
        coroutine = null;
    }

    private bool EstaoTocandoNaTela()
    {
        return Input.touchCount > 0;
    }

    private void MudarEscalaDeTempo(float escala)
    {
        Time.timeScale = escala;
        Time.fixedDeltaTime = 0.02f * Time.timeScale;
    }
}

No entanto, é importante notar que essa solução ainda não elimina completamente a necessidade dos ifs no método "Update". A verificação no método "EstaoTocandoNaTela" ainda é necessária para determinar se o jogo está pausado ou não.

Em resumo, a solução proposta pode aprimorar a organização do código e reduzir a duplicação nos métodos "ContinuarJogo" e "PararJogo", o que é um avanço positivo. Embora ainda seja necessário utilizar os condicionais no método "Update" para verificar se o jogo está pausado, essa abordagem demonstra sua curiosidade e habilidade de evoluir o código. É encorajador ver que você está buscando maneiras de melhorar a estrutura e eficiência do jogo, meus parabens!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software