我正在尝试让一个计时器在游戏重置后继续,并且现在仍然有相同的时间,每次我的角色重置时都会重置计时器。我在一个3D Unity游戏中用C#做这件事。我看了很多视频和网站,似乎没有人知道答案。这是我的代码:
void Dying()
{
Invoke("LoadFirstLevel", Delay);
}
void OnCollisionEnter(Collision collision)
{
switch (collision.gameObject.tag)
{
case "Obstacle":
LoadFirstLevel();
break;
}
}
private void LoadFirstLevel()
{
SceneManager.LoadScene(0);
}
这是我的计时器代码:
{
float currentTime = 0f;
float startingTime = 60f;
AudioSource audioSource;
[SerializeField] Text CountdownText;
void Start()`enter code here`
{
currentTime = startingTime;
}
void Update()
{
currentTime -= 1 * Time.deltaTime;
CountdownText.text = currentTime.ToString("0");
if (currentTime <= 0)
{
currentTime = 0;
}
}
}
将DontDestroyOnLoad
添加到计时器对象中。它可以防止在场景更改时破坏对象。
void Awake() {
DontDestroyOnLoad(this.gameObject);
}
或者您可以使用静态变量来计算时间。它也保持了价值。
您可以使用static
字段,这样它就可以在该类的所有实例之间"共享"-会话范围!
您可以将其与第二个static bool
标志组合起来,用于指示字段之前是否初始化过,因此以后不会重置为60
,而只是第一次:
private static float currentTime = 0f;
// This could even be a constant
private const float startingTime = 60f;
private static bool isInitialized;
AudioSource audioSource;
[SerializeField] Text CountdownText;
void Start()
{
// Use the flag so this is only done once for this session
if(!isInitialized)
{
currentTime = startingTime;
isInitialized = true;
}
}
void Update()
{
currentTime -= * Time.deltaTime;
CountdownText.text = currentTime.ToString("0");
if (currentTime <= 0)
{
currentTime = 0;
}
}
现在,计时器的每个实例都会减少相同的currentTime
字段。