Unity: Как приостановить игровой таймер и показать текущее время на экране «Закончена игра» - PullRequest
0 голосов
/ 20 апреля 2020

Добрый вечер, ребята!

У меня небольшая проблема. Я создаю игру Pacman-i sh и создал таймер, который всплывает и появляется в верхнем углу экрана, который показывает текущее время, прошедшее с момента запуска первой сцены.

Я изо всех сил пытаясь остановить таймер на моей сцене за игрой

Есть ли у вас какие-либо советы для решений, которые могут работать?

Я очень новичок в C# и Unity, поэтому, пожалуйста, имейте это в виду, и извините за неудобства!

Заранее большое спасибо!

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

public Text timerText;
private float startTime;
private bool finnished = false;

// Start is called before the first frame update
void Start()
{
    startTime = Time.time;

}

// Update is called once per frame
void Update()
{
    if (finnished)
        return;

    float t = Time.time - startTime;

    string minutes = ((int)t / 60).ToString();
    string seconds = (t % 60).ToString("f2");

    timerText.text = minutes + ":" + seconds;

}


public void Finnish()
{
    finnished = true;
    timerText.color = Color.yellow;
}

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Вы можете попробовать событие:

Подписаться на делегат события stopEvent:

public Text timerText;
private float startTime;
private bool finnished = false;

GameManager.stopEvent += Finnish;

// Start is called before the first frame update
void Start()
{
    startTime = Time.time;
}

// Update is called once per frame
void Update()
{
    if (!finnished)
    {
        float t = Time.time - startTime;

        string minutes = ((int)t / 60).ToString();
        string seconds = (t % 60).ToString("f2");

        timerText.text = minutes + ":" + seconds;
    }
}


public void Finnish()
{
    finnished = true;
    timerText.color = Color.yellow;
}

Внутри скрипта (скажем, GameManager.cs или что-то еще), вы создаете событие и делегируете:

public delegate void EventHandler();
public static event EventHandler stopEvent;

Ваш код загрузки сцены (например, может быть вызван из кода загрузки в GameManager.cs)

//// scene is done
stopEvent();

Вы можете сохранить результат таймера в синглтоне, возможно, в файле GameManager.cs, который представляет собой синглтон, который живет в разных сценах.

1 голос
/ 20 апреля 2020

Хорошо, Kale_Surfer_Dude, так что я вроде как выяснил, как вызвать Finni sh (); при входе в одну из двух моих сцен финиша / гола, но почему-то не срабатывает, когда id ie или fini sh.

Вы понимаете, почему?

public Text timerText;
private float startTime;
private bool finnished = false;

// Start is called before the first frame update
void Start()
{
    startTime = Time.time;

    // Creating temporary reference to current scene
    Scene currentScene = SceneManager.GetActiveScene();

    // Retrieve the name of this scene.
    string sceneName = currentScene.name;

    if(sceneName == "Goal" || sceneName == "MenuOnCollision")
    {
        Finnish();
    }

    // Retrieve the index of the scene in the project's build setting
    int buildIndex = currentScene.buildIndex;

    // Check the scene name as a conditional
    switch (buildIndex)
    {
        case 4:
            Finnish();
            break;
        case 6:
            Finnish();
            break;
    }

}

// Update is called once per frame
void Update()
{
    if (!finnished) {

        float t = Time.time - startTime;


        string minutes = ((int)t / 60).ToString();
        string seconds = (t % 60).ToString("f2");

        timerText.text = minutes + ":" + seconds;
    }

}


public void Finnish()
{
    finnished = true;
    timerText.color = Color.yellow;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...