【问题标题】:How to create a time counter using C# in Unity 3D如何在 Unity 3D 中使用 C# 创建计时器
【发布时间】:2015-01-10 01:30:29
【问题描述】:

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

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

【问题讨论】:

    标签: c# unity3d timer


    【解决方案1】:

    在游戏开始时,您保存startTime,然后您决定一轮应该持续多长时间,roundTime

    例子:

    startTime = Time.time;
    roundTime = 1000f; // seconds.
    

    然后你可以简单地检查时间已经过去了。

    function Update ()
    {
        if (Time.time - startTime >= roundTime)
        {
            // Game ended, restart.
            startTime = Time.time;
        }
    }
    

    【讨论】:

      【解决方案2】:

      请改用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

      【讨论】:

        【解决方案3】:

        您可以使用私有变量来跟踪时间。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-17
          相关资源
          最近更新 更多