每次分数增加时重置计时器

时间:2018-01-28 21:28:12

标签: c# unity3d timer game-engine

我目前为游戏控制器编写了这个C#代码。我想更改代码,因此每次玩家得分时计时器都会重新启动。我现在想不出怎么做,我确定它很简单!请原谅我是一名自学编码器的问题,但尚未获得所有知识。谢谢

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Runtime.InteropServices;

public class GameController: MonoBehaviour {
 public BlockGenerator blockGenerator;
 public GameUI gameUI;
 public SoundController soundController;
 public bool playable;
 public float initTimer = 30 f;
 public bool gameOver = false;

 private int score;
 private int bestScore;
 private float timer;

 public float Timer {
  get {
   return timer;
  }
  set {
   timer = value;
   gameUI.UpdateTime();
  }
 }

 public int BestScore {
  get {
   return bestScore;
  }
 }

 public int Score {
  get {
   return score;
  }
  set {
   score = value;
   gameUI.UpdateScore();
  }
 }

 void Start() {
  playable = false;
  Timer = initTimer;
  Score = 0;
  bestScore = PlayerPrefs.GetInt("BestScore", 0);
 }

 void Update() {
  if (playable) {
   if (timer > float.Epsilon) {
    Timer -= Time.deltaTime;
   } else {
    gameOver = true;
   }
  }


  if (gameOver) {
   GameOver();
   soundController.PlayGameOver();
   gameOver = false;
  }
 }

 public void GetScore() {
  Score += 1;
  blockGenerator.GenerateBlock();
  soundController.PlayBingo();

 }

 public void GameOver() {
  playable = false;
  SaveData();
  gameUI.GameOver();
 }

 public void Restart() {
  Score = 0;
  Timer = initTimer;
  playable = false;
  blockGenerator.BlockReset();
  blockGenerator.GenerateBlock();
  gameUI.Restart();
 }

 void SaveData() {
  if (bestScore < score) {
   bestScore = score;
   PlayerPrefs.SetInt("BestScore", bestScore);
  }
 }
}

2 个答案:

答案 0 :(得分:1)

您有两种选择:

选项1:在GetScore方法中重置计时器:

public void GetScore() {
  Score += 1;
  blockGenerator.GenerateBlock();
  soundController.PlayBingo();
  Timer = initTimer;
 }

选项2:在Score属性设置器中重置计时器:

    public int Score {
      get {
       return score;
      }
      set {
       score = value;
       Timer = initTimer;
       gameUI.UpdateScore();
      }
     }

如果你选择2;您也可以从Start方法中删除以下行:

Timer = initTimer;

如果在任何其他情况下调用Score setter,则选项1是更好的选择。

答案 1 :(得分:-2)

你想要的是速率限制代码。我原来写的这个是在一个单独的线程中运行的,但你应该能够根据你的情况重新使用它:

integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);

while(true){
  if(DateTime.Now >= dueTime){
    //insert code here

    //Update next dueTime
    dueTime = DateTime.Now.AddMillisconds(interval);
  }
  else{
    //Just yield to not tax out the CPU
    Thread.Sleep(1);
  }
}

您可能需要移动&#34;到期时间&#34;到主线程,可能需要通过lock()进行一些sycnhronization。

不幸的是&#34;定时器&#34;不是一个非常清楚的描述。根据我的最后一次计算,.NET Framework中至少有5个不同的计时器,其中几个是某些显示技术独有的。

由于这是Unity,这可能是游戏设计,可能完全拥有它自己的方法。