我需要的是每隔几秒增加一次玩家统计数据,并且能够在按下任意键的情况下中断此过程。
以下是我的协程。它无休止地运行,有什么建议吗?
script hook v is violating access
答案 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!");
}
}
}