简体   繁体   English

Unity 定时器重置

[英]Unity Timer Reset

I have a timer in my game which should count the time till the end of the game.我的游戏中有一个计时器,它应该计算直到游戏结束的时间。 I can't figure out how to make it so it will only reset back to 0 when menu scene is active (build index 0).'我不知道如何制作它,所以它只会在菜单场景处于活动状态时重置回 0(构建索引 0)。 The second problem is that I don't want it to go back to 0 after every death(scene reload).第二个问题是我不希望 go 在每次死亡(场景重新加载)后回到 0。 Have you got any sugestions?你有什么建议吗?

using UnityEngine; 
using UnityEngine.UI; 
using UnityEngine.SceneManagement;

public class Timer : MonoBehaviour { 
public Text TimerText; 
public bool shouldCountTime; 
public float t;

 private void Start()
 {
     if (SceneManager.GetActiveScene().buildIndex != 0)
     {
         shouldCountTime = true;
     }
     else
     {
         shouldCountTime = false;
         t = 0;
     }
     t = Time.deltaTime;
 }
 void Update()
 {
     if (shouldCountTime) {
         t += Time.deltaTime;
     }
     string minutes = ((int)t / 60).ToString();
     string seconds = (t % 60).ToString("f2");
     TimerText.text = minutes + ":" + seconds;
 } 
}

As mentioned you should make it a singleton (meaning only one instance should exist at a time - not speaking about the general (ab)use of having a public static reference;) )如前所述,您应该将其设为 singleton (意味着一次只应存在一个实例 -谈论拥有公共 static 参考的一般(ab)使用;)

And use DontDestroyOnLoad in order to keep your object also when the scene is changed and for the resetting use SceneManager.sceneLoaded and check the index of the newly loaded scene like eg并使用DontDestroyOnLoad以在场景更改时保留您的 object 并使用SceneManager.sceneLoaded进行重置并检查新加载场景的索引,例如

public class Timer : MonoBehaviour 
{ 
    // Make sure this text is also not destroyed
    // e.g. make its entire canvas a child of this object
    public Text TimerText; 
    public bool shouldCountTime; 
    public float t;

    // Singleton Pattern -> make sure only one instance exists in your scene
    private static Timer _instance;

    private void Awake()
    {
        // does another instance already exist?
        if(_instance && _instance != this)
        {
            // if so detroy this one
            Destroy(gameObject);
            return;
        }

        // This is the active instance
        _instance = this;

        // Don't destroy this GameObject when a new scene is loaded
        DontDestroyOnload(gameObject);

        // Attach a callback for every new scene that is loaded
        // It is fine to remove a callback that wasn't added so far
        // This makes sure that this callback is definitely only added once
        // usually I do this only as a kind of convention
        SceneManager.sceneLoaded -= OnSceneLoaded;
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    // Will be called every time a scene is loaded
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // check the build index
        shouldCountTime = scene.buildIndex != 0;

        // Reset in the main menu
        if(!shouldCountTime)
        {
            Debug.Log("Reset timer", this);
            t = 0;
            TimerText.text = "0:00";
        }
    }

    private void OnDestroy()
    {
        // Even though your object most probably lives during the entire application lifetime
        // again just as a convention always remove callbacks as soon as not needed anymore
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }

     void Update()
     {
         // do your calculations only while the value is actually changing
         if (!shouldCountTime) return;

         t += Time.deltaTime;
         var minutes = ((int)t / 60).ToString();
         var seconds = (t % 60).ToString("f2");
         TimerText.text = minutes + ":" + seconds;
     } 
}

If changing the hierarchy (regarding eg the Text) is not an option than rather refer to How to pass data between scenes in Unity for alternative solutions for caring over the value.如果更改层次结构(例如关于文本)不是一种选择,请参阅如何在 Unity 中的场景之间传递数据以获取关心值的替代解决方案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM