как сделать Coroutine Timer более плавным - PullRequest
0 голосов
/ 21 июня 2019

Я строю пустую игру, в которой есть пара сцен. я хотел знать, есть ли лучший способ сделать таймер, потому что, когда я вхожу в сцену с таймером, у меня есть задержка перед обновлением текста

Я использую Coroutine для вычитания каждые 1 сек.


public class CoalResarch : MonoBehaviour
{

    bool CreatingWords = false;
    public bool timerIsDone = false;
    public static float hour = 1;
    public static float min = 0;
    public static float sec = 1;
    void Update()
    {

        if (CreatingWords == false)
        {
            CreatingWords = true;
            StartCoroutine(DisplayWoodMinningSec());
        }

    }
    public IEnumerator DisplayWoodMinningSec()
    {
        //Timer
        if (SceneManager.GetActiveScene() == SceneManager.GetSceneByName("ResearchScene"))
        {
            GlobalResearch.CoalTimer.text = "0" + hour + ":" + min + ":" + Mathf.Round(sec);
        }
        yield return new WaitForSeconds(1);
        sec -= 1;

        if (timerIsDone == false && sec < 0)
        {
            if (min > 0)
            {
                min -= 1;
                sec = 59;
            }
            else
            {
                if (hour > 0)
                {
                    hour -= 1;
                    min = 59;
                    sec = 59;
                }
                else
                {
                    sec = 0;
                }
            }

            if (hour == 0 && min == 0 && sec == 0)
            {
                Debug.Log("Finish!");
                if (SceneManager.GetActiveScene() == SceneManager.GetSceneByName("ResearchScene"))
                {
                    //      GlobalResearch.CoalTimer.text = "Finished !";
                }
            }

        }

        if (SceneManager.GetActiveScene() == SceneManager.GetSceneByName("ResearchScene"))
        {
            GlobalResearch.CoalTimer.text = "0" + hour + ":" + min + ":" + Mathf.Round(sec);
        }
        CreatingWords = false;

    }
}

Я просто хочу, чтобы он работал более плавно, помогите, пожалуйста:)

1 Ответ

0 голосов
/ 21 июня 2019

Используйте цикл while, который длится, пока любая цифра> 0.Кроме того, используйте int вместо float, потому что вы заинтересованы только в работе с целыми числами.Вы также можете упростить условия обновления в секунду / мин / час:

public class CoalResarch : MonoBehaviour
{

    bool CreatingWords = false;
    public bool timerIsDone = false;
    public static int hour = 1;
    public static int min = 0;
    public static int sec = 1;
    void Update()
    {

        if (CreatingWords == false)
        {
            CreatingWords = true;
            StartCoroutine(DisplayWoodMinningSec());
        }

    }
    public IEnumerator DisplayWoodMinningSec()
    { 
        while (hour>0 || min>0 || sec > 0)
        {
            //Timer
            if (SceneManager.GetActiveScene() == SceneManager.GetSceneByName("ResearchScene"))
            {
                GlobalResearch.CoalTimer.text = "0" + hour + ":" + min + ":" + Mathf.Round(sec);
            }
            yield return new WaitForSeconds(1);
            sec -= 1;

            if (sec < 0)
            {
                sec = 59;
                min -= 1;
                if (min < 0)
                {
                    hour -= 1;
                    min = 59;
                }
            }
        }

        timerIsDone = true;
        Debug.Log("Finish!");

        if (SceneManager.GetActiveScene() == SceneManager.GetSceneByName("ResearchScene"))
        {
            GlobalResearch.CoalTimer.text = "0" + hour + ":" + min + ":" + Mathf.Round(sec);
        }
        // GlobalResearch.CoalTimer.text = "Finished !";
        CreatingWords = false;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...