如何在Unity 3D中使用C#创建时间计数器

时间:2014-11-13 01:26:02

标签: timer unity3d unityscript

我想为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;
} 

我的问题是:如何创建一个渐进式时间计数器,我可以重置,而无需重新加载游戏,场景或关卡?

3 个答案:

答案 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;
}

您可以随时设置或重置该浮动。