Unity. Перестал работать Time.timeScale

129
18 мая 2019, 20:00

Делаю игру на мобильные устройства на движке Unity. В игре есть такой момент, когда при столкновении игрока с препятствием я ставлю Time.timeScale = 0.1f, а потом через несколько секунд возвращаю до Time.timeScale = 1f. И все работало, до тех пор, пока я не решил добавить UI, а конкретно паузу. Тоесть при нажатии Pause я ставлю timeScale на 0, а при нажатии кнопки Resume timeScale на 1. Собственно в чем проблема - после добавлении UI перестало работать замедление времени в игре. Пробовал сделать новую сцену, добавить все заново - скрипт столкновения работает. При добавлении UI с паузой перестает работать. код для персонажа:

private void OnTriggerEnter2D(Collider2D col)
{
    if (col.gameObject.tag == "Enemy")
    {
        death_pause = true;
        Destroy(Pie_Sprite); //что сделать при смерти?
    }
}
IEnumerator Waiting_forDeath()
{
    Time.timeScale = 0.1f;
    yield return new WaitForSecondsRealtime(0.5f);
    Time.timeScale = 1;
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); //перезапуск уровня
}

// Update is called once per frame 
void Update () {
    if (death_pause)
    {
        StartCoroutine(Waiting_forDeath());
        death_pause = false;
    }
}

а вот код паузы:

void Update () {
    if (InPause)
    {
        Pause();
    }
    else
    {
        Resume();
    }
}
public void Pause()
{
    PauseButton.SetActive(false);
    MenuNavigation.SetActive(true);
    InPause = true;
    Time.timeScale = 0f;
}
public void Resume()
{
    PauseButton.SetActive(true);
    MenuNavigation.SetActive(false);
    InPause = false;
    Time.timeScale = 1f;
}
public void Menu()
{
    SceneManager.LoadScene("MainMenu");
    Time.timeScale = 1f;
}

Подскажите, где ошибка?

Answer 1

Всё просто.

При столкновении с Врагом у Вас ставится флаг death_pause, который сигнализирует о необходимости при следующем обновлении кадра запустить корутину с изменением TimeScale.

Однако, в UI у Вас каждый каджый кадр идет проверка на другой флаг - InPause.

И вот что происходит: корутина выполняет свою работу - устанавливает "масштаб времени" в 0,1; но за этот же кадр в UI проверка на флаг InPause не проходит и поэтому выполняется метод Resume(), который всё за тот же кадр возвращает TimeScale в 1,0.

READ ALSO
c# report форматированный экспорт

c# report форматированный экспорт

значит есть бд с 3 таблицами

160
Unit Test ASP.NET CORE 2.1 System.NullReferenceException response

Unit Test ASP.NET CORE 2.1 System.NullReferenceException response

Делал модульные тесты для проекта ASPNET CORE

172