Скрытие обратного отсчета, когда игра приостановлена, перезапускает его, когда игра возобновляется - PullRequest
0 голосов
/ 20 февраля 2019

Я могу приостановить свою игру как во время игры, так и перед обратным отсчетом перед игрой (3, 2, 1) - оба отслеживаются в GameManager как UserIsPlaying, только отсчет отслеживается как CountdownIsOn (как и выв сценарии увидите фрагменты).

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я приостанавливаю игру во время обратного отсчета, а затем возобновляю, отсчет возобновляется (полагаю, это связано с тем, что яя скрываю его как игровой объект, и к этому игровому объекту прикреплен скрипт обратного отсчета).

Вот соответствующая часть моего сценария PauseMenu (я делаю обратное в общедоступном аналоге Resume voidтот же сценарий).

public GameObject pauseMenuUI;
public GameObject hidePauseButtonPM;

public GameObject hidePlayer;
public GameObject hideCountdownPause;

public void Pause ()
{        
    pauseMenuUI.SetActive(true);
    hidePauseButtonPM.SetActive(false);

    if (GameManager.CountdownIsOn)
    {
        hidePlayer.SetActive(false);
        hideCountdownPause.SetActive(false); 

    }
    if (GameManager.UserIsPlaying && !GameManager.CountdownIsOn)
    {
        hidePlayer.SetActive(false);                        
    }

    Time.timeScale = 0f;
    GameIsPaused = true;
}

Это мой сценарий обратного отсчета.

public Color color3;     
public Color color2;
public Color color1;

Text countdown;    

void OnEnable()
{
    countdown = GetComponent<Text>();
    countdown.text = "3";        
    StartCoroutine("Countdown");
}

IEnumerator Countdown()
{
    int count = 3;

    for (int i = 0; i < count; i++)
    {
        countdown.text = (count - i).ToString();            
        if ((count - i) == 3)
        {
            countdown.color = color3;                
        }
        if ((count - i) == 2)
        {
            countdown.color = color2;                
        }
        if ((count - i) == 1)
        {
            countdown.color = color1;                
        }
        yield return new WaitForSeconds(1);            
    }
    StartRound();
}

Поэтому мой вопрос к вам: как мне спрятать обратный отсчет во время Pause, чтобы он не перезапустился Resume?

Мысль (и попытка безрезультатно) изменить альфа-версию текста обратного отсчета до 0, когда игра приостановлена, и вернуться к 255 после возобновления.Также попытался прикрепить мой скрипт обратного отсчета к моей основной камере и изменил Text countdown; на public Text countdown;, чтобы я мог передать ему свой текст обратного отсчета, но ничего.

1 Ответ

0 голосов
/ 20 февраля 2019

Чем вы запускаете новый Coroutine в OnEnable, поэтому каждый раз, когда GameObject снова становится активным.

Вам лучше проверить, закончился ли ваш обратный отсчет раньше или нет, и только перезапускать его, если он был завершен.до.

Кроме того, вы не останавливаете сопрограмму при приостановке заметки из Сопрограммы:

Примечание : сопрограммы не останавливается, когда MonoBehaviour является отключенным , но только когда он определенно уничтожен.Вы можете остановить сопрограмму, используя MonoBehaviour.StopCoroutine и MonoBehaviour.StopAllCoroutines .Сопрограммы также останавливаются, когда MonoBehaviour уничтожен.

И поскольку вы используете Time.timeScale = 0f; для паузы, вы должны использовать WaitForSecondsRealtime для ожидания, которое не 't зависит от Time.timeScale

public Color color3;     
public Color color2;
public Color color1;

private Text countdown; 

// moved this to outer scope in order to
// "share" it among routines   
int count = 3;
// flag to control whether the last countdown was finished
private bool countdownFinished = true;    

private void Awake()
{
    // do this only once
    countdown = GetComponent<Text>();
}

private void OnEnable()
{
    countdown.text = count.ToString();        
    StartCoroutine(Countdown());
}

private void OnDisable()
{
    // just to be sure cancel all running Coroutines
    // should be done anyway automatically
    StopAllCoroutines();
}

private IEnumerator Countdown()
{
    // only restart the countdown if it was finished before
    // otherwise continue the last one
    if (countdownFinished) count = 3;

    countdownFinished = false;

    // inverting that for loop would make things a lot
    // easier for you
    while (count > 0)
    {
        countdown.text = count.ToString();

        // better use a switch for that         
        switch (count)
        {
            case 3:
                countdown.color = color3;
                break;

            case 2:
                countdown.color = color2;
                break;

            case 1:
                countdown.color = color1;
                break;
        }

        yield return new WaitForSecondsRealtime(1);
        count--;
    }

    countdownFinished = true;
    StartRound();
}

Результат: Продолжается, если обратный отсчет не завершился до отключения, иначе начинается новый отсчет.

enter image description here

для примера, который я только что сделал

private void StartRound()
{
    countdown.text = "GO!";
}

Вместо этого переключателя вы также можете просто использовать

public List<Color> colors = new List<Color>();

, чтобы добавить свои цвета в список (самый верхний пчелиный цвет1, самый нижний пчелиный цвет3), а затем просто используйте

countdown.color = colors[count -1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...