Coroutine无法启动,因为游戏对象处于非活动状态

时间:2017-06-12 14:20:33

标签: c# unity3d timer coroutine

我收到了#34的错误;由于游戏对象TimeOutWarningDialog'而且Coroutine无法启动。不活跃!"但我不确定为什么我会收到这个错误。

只是给出代码的简要说明:

  1. 我在GameManger.Update()中寻找不活动

  2. 如果在一段时间内处于非活动状态,我会调用GameManager.ShowRestartWarning()

  3. TimeOutWarningDialog将SetActive设为true

  4. 我在调用StartRestartTimer()之前检查对象是否处于活动状态,if(timerInstance.activeSelf == true)StartRestartTimer();

  5. 我在CountdownTimer类中调用startTimer()

  6. 我正在设置我正在设置为“活跃”的对象。在我调用包含协同程序的startTimer函数之前。我在这做错了什么?  任何帮助都会很棒!!

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    
    public class CountdownTimer : MonoBehaviour
    {
        public float countdownLength;
        public Text timerText;
        public bool stop = true;
        private float minutes;
        private float seconds;
    
        public void startTimer(float from)
        {
            stop = false;
            countdownLength = from;
            Update();
            StartCoroutine(updateCoroutine());
        }
    
        void Update()
        {
            if (stop) return;
            countdownLength -= Time.deltaTime;
    
            minutes = Mathf.Floor(countdownLength / 60);
            seconds = countdownLength % 60;
            if (seconds > 59) seconds = 59;
            if (minutes < 0)
            {
                stop = true;
                minutes = 0;
                seconds = 0;
            }
        }
    
        private IEnumerator updateCoroutine()
        {
            while (!stop)
            {
                timerText.text = string.Format("{0:0}:{1:00}", minutes, seconds);
                yield return new WaitForSeconds(0.2f);
                Debug.Log(string.Format("{0:0}:{1:00}", minutes, seconds));
            }
        }
    }
    

    然后我在下面的CountdownTimer类中调用startTimer:

    import java.applet.Applet;
    public class MyApplet extends Applet{
    
    }
    

1 个答案:

答案 0 :(得分:1)

问题出在这个方法中:

void StartRestartTimer()
{
    CountdownTimer countdownTimer = timeOutWarningDialog.GetComponent<CountdownTimer>();
    countdownTimer.startTimer(countdownLength);

    CancelInvoke();
    Invoke("RestartGame", countdownLength);
}

首先启动协程,然后调用RestartGame加载另一个场景。所以带有协程的对象就会被破坏。

我不能给你解决方案,因为它需要更多关于你的场景的知识,但你可能想尝试添加场景加载。