[英]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.