@SkyCrusher

Как сделать задержку после паузы?

Проблема такая. Есть пауза, которая стопит всю игру через Time.timeScale, ну и анимация воспроизводится. Всё работает нормально. Только игрок после снятия паузы не успевает среагировать и, чаще всего, умирает. В связи с этим стоит вопрос. Как сделать так, чтобы после того, как возобновляешь игру игроку давалось определённое кол-во времени (например пять секунд), которое выводилось(!) на экран. По типу, отжал паузу, на экране обратный отсчёт (5, 4, 3, 2, 1) и возобновилась игра. Долго гуглил, не смог ничего толкового на этот счёт найти. Надеюсь на вашу помощь.
Вот скрипт , через который хочу всю эту баню реализовывать.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PauseButton : MonoBehaviour {

    bool OnClick;
    public static bool Paused;

    public float WaitToPause;
    public Sprite SpritePause;
    public Sprite SpritePlay;
    Text TimeAfterPause;

    private void Start()
    {
        GetComponent<Image>().sprite = SpritePause;
        Paused = false;
    }

    public void Pause()
    {
        if (!Paused && !OnClick)
        {
            OnClick = true;
            GetComponent<Image>().sprite = SpritePlay;
            Paused = true;
            StartCoroutine(AnimationStop(new Vector3(180, 0, 0), 0.3f));
        }
        else if (Paused && !OnClick)
        {
            Time.timeScale = 1;
            OnClick = true;
            GetComponent<Image>().sprite = SpritePause;
            Paused = false;
            StartCoroutine(AnimationPlay(new Vector3(180, 0, 0), 0.3f));
        }
    }

    IEnumerator AnimationStop(Vector3 byAngles, float inTime)
    {
        var fromAngle = transform.rotation;
        var toAngle = Quaternion.Euler(transform.eulerAngles + byAngles);
        for (var t = 0f; t < 1; t += Time.deltaTime / inTime)
        {
            transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t);
            yield return null;
        }
        OnClick = false;
        StartCoroutine(Stop());
    }

    IEnumerator AnimationPlay(Vector3 byAngles, float inTime)
    {
        var fromAngle = transform.rotation;
        var toAngle = Quaternion.Euler(transform.eulerAngles + byAngles);
        for (var t = 0f; t < 1; t += Time.deltaTime / inTime)
        {
            transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t);
            yield return null;
        }
        OnClick = false;
    }

    IEnumerator Stop()
    {
        Time.timeScale = 0;
        yield return null;
    }
}
  • Вопрос задан
  • 388 просмотров
Решения вопроса 1
AGlassOfWhiskey
@AGlassOfWhiskey
Unity Game Developer (c#)
Решением данной задачи предлагаю использовать Корутину.
Каждая итерация держит секунду, до определенной границы времени timerAfterPause.
При нажатии на клавишу "A" начнется отсчет.

private const int timerAfterPause = 5;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
            StartCoroutine(StartWaitAfterPause(timerAfterPause));
    }

    IEnumerator StartWaitAfterPause(int value)
    {      
        int iterator = 0;

        while (iterator < value)
        {
            Debug.Log(value - iterator);
            yield return new WaitForSeconds(1f);
            iterator++;
        }
        EndWaitAfterPause();
    }

    void EndWaitAfterPause()
    {
        StopCoroutine("WaitAfterPause");
        Debug.Log("GO!");
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
hePPer
@hePPer
так вы и не отжимайте ему сразу паузу. игрок нажал кнопку снятия с паузы - вы ему выведите отсчет а потом снимайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы