Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StopCorroutine后重置倒计时时间_C#_Unity3d_Counter_Countdown - Fatal编程技术网

C# StopCorroutine后重置倒计时时间

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

我不知道如何重置计时器的非活动倒计时。我正在使用一个协同程序来处理倒计时,然后使用Stop协同程序通过按下按钮停止倒计时。但是,当倒计时对话框恢复并重新启动时(在不活动后),计数将从它之前关闭的值开始。如何在每次计数器实例化时将计数重置为完全倒计时量

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