Делаю игру на мобильные устройства на движке 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;
}
Подскажите, где ошибка?
Всё просто.
При столкновении с Врагом у Вас ставится флаг death_pause, который сигнализирует о необходимости при следующем обновлении кадра запустить корутину с изменением TimeScale.
Однако, в UI у Вас каждый каджый кадр идет проверка на другой флаг - InPause.
И вот что происходит: корутина выполняет свою работу - устанавливает "масштаб времени" в 0,1; но за этот же кадр в UI проверка на флаг InPause не проходит и поэтому выполняется метод Resume(), который всё за тот же кадр возвращает TimeScale в 1,0.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Делал модульные тесты для проекта ASPNET CORE