一些玩家输入后如何突破协程中的循环?

时间:2017-01-06 00:55:35

标签: c# unity3d coroutine ienumerator

我需要的是每隔几秒增加一次玩家统计数据,并且能够在按下任意键的情况下中断此过程。

以下是我的协程。它无休止地运行,有什么建议吗?

script hook v is violating access

2 个答案:

答案 0 :(得分:2)

  

它无休止地运行,有什么建议吗?

是。不要使用yield return new WaitForSeconds等待。 在此期间错过输入事件(if (Input.anyKeyDown))。

在协程函数中使用计数器的另一种方法是使用Time.deltaTime;递增变量,然后等待yield return null;,当你使用{{1}时只等待一帧而不是几秒钟}。

这就是我上面解释的那样:

yield return new WaitForSeconds

请务必使用IEnumerator PlayerAction(PlayerStats playerStats, int incrementor1) { const float secToIncrement = 1f; //When to Increment (Every 1 second) float counter = 0; while (true) { //Check if we have reached counter if (counter > secToIncrement) { counter = 0f; //Reset Counter //Increment Player stats playerStats.Energy += incrementor1; GameClock.Tic++; Debug.Log("My first courutine is working!"); } //Increment counter counter += Time.deltaTime; //Check if we want to exit coroutine if (Input.anyKeyDown) { Debug.Log("Action is break"); yield break; } //Yield in a while loop to prevent freezing yield return null; } }

StartCoroutine函数调用协同程序

答案 1 :(得分:-1)

我猜你错过了coroutine中的输入检测,我建议检测更新中的输入并使用变量来检查它,如下所示:

bool isAnyKeyDown = false;//detect is anykeypressed

void Update(){
  if (Input.anyKeyDown){
          isAnyKeyDown = true;
   }

}

IEnumerator PlayerAction(PlayerStats playerStats, int incrementor1) 
{
    bool loop = true;
    while (loop)
    {
        if (isAnyKeyDown)
        {
            loop = false;
            Debug.Log("Action is break");
            StopCoroutine("PlayerAction");
            isAnyKeyDown = false;
            yield break;
        }
        else
        {
            yield return new WaitForSeconds(2);
            playerStats.Energy += incrementor1;
            GameClock.Tic++;
            Debug.Log("My first courutine is working!");
        }
    }
}