我目前为游戏控制器编写了这个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);
}
}
}
答案 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,这可能是游戏设计,可能完全拥有它自己的方法。