我想为Unity 3D游戏创建一个时间计数器。
我已经尝试过使用Time.time但我无法重置计时器而无需重置整个游戏。 timeSinceLevelLoad对我不起作用,因为需要重新加载关卡。
我尝试在FixedUpdate中使用Time.deltaTime,但我觉得时间不对。我无法重新加载游戏或关卡的原因是我的机器状态仅为一个场景:
switch (currentState) {
case GameStates.START:{
player.position = startPositionPlayer;
currentState = GameStates.WAITGAME;
timeScore.renderer.enabled = false;
}
break;
case GameStates.WAITGAME:{
player.position = startPositionPlayer;
timeScore.renderer.enabled = false;
}
break;
case GameStates.INGAME:{
time = Time.time;
timeScore.text = time.ToString();
}
break;
case GameStates.GAMEOVER:{
currentState = GameStates.RANKING;
player.position = startPositionPlayer;
enemy.position = startPositionEnemy;
timeScore.renderer.enabled = false;
}
break;
case GameStates.RANKING:{
player.position = startPositionPlayer;
enemy.position = startPositionEnemy;
timeScore.renderer.enabled = false;
}
break;
}
}
所以我的整个游戏都在一个场景中运行。此功能用于使用GameStates.INGAME重启游戏:
public void StartGame(){
time = 0f;
timeScore.renderer.enabled = true;
currentState = GameStates.INGAME;
}
我的问题是:如何创建一个渐进式时间计数器,我可以重置,而无需重新加载游戏,场景或关卡?
答案 0 :(得分:0)
请改用StopWatch
。它们易于使用:
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//Your game
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
在您的代码中替换启动计数器的代码:
/*
* Replace
*/
time = 0f;
timeScore.renderer.enabled = true;
/*
* By
*/
time = new Stopwatch();
time.Start();
阻止它的代码:
/*
* Replace
*/
time = Time.time;
timeScore.text = time.ToString();
/*
* By
*/
stopWatch.Stop();
timeScore.text = stopWatch.Elapsed.ToString();
请参阅:http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsed(v=vs.110).aspx了解有关StopWatch的更多信息
答案 1 :(得分:0)
在游戏开始时,您保存startTime
然后您决定一轮应该持续多长时间roundTime
。
示例:
startTime = Time.time;
roundTime = 1000f; // seconds.
然后你可以简单地检查时间已经过去了。
function Update ()
{
if (Time.time - startTime >= roundTime)
{
// Game ended, restart.
startTime = Time.time;
}
}
答案 2 :(得分:0)
您可以使用私人变量来跟踪时间。
public float RoundLength = 30f;
private float timeKeeper;
private bool isPaused = false;
private bool gameIsOver = false;
void Start() {
this.timeKeeper = this.RoundLength;
}
void Update() {
if (!this.isPaused && !this.gameIsOver) {
this.timeKeeper -= Time.deltaTime;
if (this.timeKeeper < 0f) DoGameOver();
}
}
void DoGameOver() {
this.gameIsOver = true;
}
您可以随时设置或重置该浮动。