C# StopCorroutine后重置倒计时时间
我不知道如何重置计时器的非活动倒计时。我正在使用一个协同程序来处理倒计时,然后使用Stop协同程序通过按下按钮停止倒计时。但是,当倒计时对话框恢复并重新启动时(在不活动后),计数将从它之前关闭的值开始。如何在每次计数器实例化时将计数重置为完全倒计时量C# StopCorroutine后重置倒计时时间,c#,unity3d,counter,countdown,C#,Unity3d,Counter,Countdown,我不知道如何重置计时器的非活动倒计时。我正在使用一个协同程序来处理倒计时,然后使用Stop协同程序通过按下按钮停止倒计时。但是,当倒计时对话框恢复并重新启动时(在不活动后),计数将从它之前关闭的值开始。如何在每次计数器实例化时将计数重置为完全倒计时量 using UnityEngine; using UnityEngine.UI; using System.Collections; using UnityEngine.SceneManagement; public class GameMana
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager gameManagerInstance = null; // Create Singleton
public Color defaultBackgroundColor;
public Object startingScene;
public GameObject timeOutWarningDialog;
private float countdownLength = 15;
private float countdownDelay = 5;
private float countdownInterval = 1;
private IEnumerator counter;
private Button stopCountButton;
private Text timerTextField;
private Vector3 prevMousePosition;
private Scene currentScene;
private GameObject gameManager;
private GameObject canvas;
private GameObject timerInstance;
void Awake()
{
if (gameManagerInstance == null)
gameManagerInstance = this;
else if (gameManagerInstance != null)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
gameManager = GameObject.FindGameObjectWithTag("GameManager");
}
void Start()
{
counter = RunTimer(countdownLength);
prevMousePosition = Input.mousePosition;
currentScene = SceneManager.GetActiveScene();
}
void Update()
{
if (Input.anyKeyDown || Input.mousePosition != prevMousePosition)
{
currentScene = SceneManager.GetActiveScene();
if (currentScene.name != startingScene.name)
StartPreCountTimer();
if (timeOutWarningDialog != null)
timeOutWarningDialog.SetActive(false);
}
prevMousePosition = Input.mousePosition;
}
// GAME TIMER
public void StartPreCountTimer()
{
CancelInvoke();
if (GameObject.FindGameObjectWithTag("Timer") == null)
Invoke("ShowRestartWarning", countdownDelay);
}
void ShowRestartWarning()
{
canvas = GameObject.FindGameObjectWithTag("Canvas");
timerInstance = Instantiate(timeOutWarningDialog); // instantiate timeout warning dialog
timerInstance.transform.SetParent(canvas.transform, false);
timerInstance.SetActive(true);
Text[] textFields = timerInstance.GetComponentsInChildren<Text>(true); // get reference to timer textfields
timerTextField = textFields[1]; // access and assign countdown textfield
stopCountButton = timerInstance.GetComponentInChildren<Button>(); // get reference to keep playing button
stopCountButton.onClick.AddListener(StopTimer); // add button listener
if (timerInstance.activeSelf == true)
StartCoroutine(counter);
}
IEnumerator RunTimer(float seconds)
{
float s = seconds;
while (s > 0)
{
if (timerTextField != null)
timerTextField.text = s.ToString();
yield return new WaitForSeconds(countdownInterval);
s -= 1;
}
if (s == 0)
{
RestartGame();
}
}
void StopTimer()
{
StopCoroutine(counter);
Destroy(timerInstance);
}
void RestartGame()
{
SceneManager.LoadScene(startingScene.name);
}
}
使用UnityEngine;
使用UnityEngine.UI;
使用系统集合;
使用UnityEngine.SceneManagement;
公共类GameManager:MonoBehavior
{
公共静态GameManager gameManagerInstance=null;//创建单例
公共色背景色;
公共物体启动场景;
公共游戏对象超时警告对话框;
私有浮点倒计时长度=15;
专用浮点倒计时延迟=5;
专用浮点倒计时间隔=1;
私人电子计数器;
私人按钮stopCountButton;
私有文本timerTextField;
专用矢量3鼠标前置;
私密场景;
私人游戏对象游戏管理器;
私有游戏对象画布;
私有游戏对象时间间隔;
无效唤醒()
{
if(gameManagerInstance==null)
gameManagerInstance=这个;
else if(gameManagerInstance!=null)
摧毁(游戏对象);
DontDestroyOnLoad(游戏对象);
gameManager=GameObject.FindGameObjectWithTag(“gameManager”);
}
void Start()
{
计数器=运行计时器(倒计时长度);
prevMousePosition=Input.mousePosition;
currentScene=SceneManager.GetActiveScene();
}
无效更新()
{
if(Input.anyKeyDown | | Input.mousePosition!=previmouseposition)
{
currentScene=SceneManager.GetActiveScene();
if(currentScene.name!=startingScene.name)
StartPreCountTimer();
if(timeOutWarningDialog!=null)
timeOutWarningDialog.SetActive(false);
}
prevMousePosition=Input.mousePosition;
}
//游戏计时器
public void startRecountTimer()
{
取消调用();
if(GameObject.FindGameObjectWithTag(“计时器”)==null)
调用(“ShowRestartWarning”,倒计时延迟);
}
void showrestwarning()
{
canvas=GameObject.FindGameObjectWithTag(“canvas”);
timerInstance=实例化(timeOutWarningDialog);//实例化超时警告对话框
timerInstance.transform.SetParent(canvas.transform,false);
timerInstance.SetActive(真);
Text[]textFields=timerInstance.GetComponentsInChildren(true);//获取对计时器textFields的引用
timerTextField=textFields[1];//访问并分配倒计时textfield
stopCountButton=timerInstance.GetComponentChildren();//获取继续播放按钮的引用
stopCountButton.onClick.AddListener(StopTimer);//添加按钮侦听器
if(timerInstance.activeSelf==true)
启动程序(计数器);
}
IEnumerator运行计时器(浮动秒)
{
浮动s=秒;
而(s>0)
{
if(timerTextField!=null)
timerTextField.text=s.ToString();
返回新的WaitForSeconds(倒计时间隔);
s-=1;
}
如果(s==0)
{
重启游戏();
}
}
void StopTimer()
{
StopCorroutine(计数器);
破坏(时间性);
}
void RestartGame()
{
SceneManager.LoadScene(startingScene.name);
}
}
如果您想重置(这不是正确的重置,只是一个新的协同程序)协同程序内的代码,则需要为计数器指定一个新的引用
即:
使用while来实现计时器,效率很低@David你建议我怎么做?@David对你的答案也很感兴趣:尽管在协同程序中使用while
循环是最简单的方法(我个人使用一个计时器float
变量,它在每一帧中使用Time.deltaTime
),非常好,谢谢!因此,如果每次我创建一个新引用来计数器,那么在我销毁时旧引用是否会被销毁(timerInstance)?很抱歉,我将新引用放置到了错误的位置,并进行了编辑以更正错误。最好在StopCoroutine
之后给出新的引用,以表明其意图是“重置”该协同程序。@greyBow如果解决了您的问题,请不要忘记接受答案。如果没有,请注释掉缺失的内容。
void StopTimer() {
StopCoroutine(counter);
counter = RunTimer(countdownLength);
Destroy(timerInstance);
}