如何让协程像更新一样执行
How to have an Coroutine Act like an Update
有人告诉我,当我不需要使用更新时,我不应该使用它们。我不确定什么时候不使用它们,但我正在想办法。
我想要一个事件,"Wave"、运行 持续 20 秒,然后切换到随机 "Wave" 和 运行 再持续 20 秒并不断重复这个周期。
游戏管理员:
void Start()
{
StartFireWaves();
}
public void StartFireWaves()
{
StartCoroutine(wm.SelectWave());
}
Wave 经理:
public IEnumerator SelectWave()
{
float waitFor;
float diff = 0;
diff = nextWaveAT - Time.time;
if (diff <= 0f)
{
SpawnFlames();
waitFor = Random.Range(15, 20);
}
nextWaveAT = nextWaveAT + waitFor;
yield return new WaitForSeconds(waitFor);
}
SpawnFlames:
void SpawnFlames()
{
float val = Random.value;
if (val < .25f)
{
Wave1();
}
if (val >= .25f && val < .5f)
{
Wave2();
}
if (val >= .5f && val < .75f)
{
Wave3();
}
else
{
Wave4();
}
}
我假设它应该是这样工作的,但它似乎并没有保持 "updating" 或 运行ning。它只是 运行 一次,然后什么也没有发生。
使用 Coroutine
和多个嵌套 while
循环来执行此操作。第一个 while
循环是让它永远 运行 直到调用 stopRunningWaves() 函数。第二个 while
循环用于 运行 波 x 时间量然后跳回到第一个 while
循环。
bool keepRunningWaves = false;
IEnumerator startingRunningWaves(float second = 20)
{
if (keepRunningWaves)
{
yield break;
}
keepRunningWaves = true;
while (keepRunningWaves)
{
float timer = 0;
int randWave = Random.Range(1, 5);
while (timer < second)
{
if (!keepRunningWaves)
{
yield break;
}
if (randWave == 1)
{
Debug.Log("Running Wave 1");
Wave1();
}
else if (randWave == 2)
{
Debug.Log("Running Wave 2");
Wave2();
}
else if (randWave == 3)
{
Debug.Log("Running Wave 3");
Wave3();
}
else if (randWave == 4)
{
Debug.Log("Running Wave 4");
Wave4();
}
timer += Time.deltaTime;
yield return null;
}
//Reset Timer for next run
timer = 0;
yield return null;
}
keepRunningWaves = false;
}
void stopRunningWaves()
{
keepRunningWaves = false;
}
要进行测试,请使用 3 秒来完成,这样可以节省您的时间:
StartCoroutine(startingRunningWaves(3));
有人告诉我,当我不需要使用更新时,我不应该使用它们。我不确定什么时候不使用它们,但我正在想办法。
我想要一个事件,"Wave"、运行 持续 20 秒,然后切换到随机 "Wave" 和 运行 再持续 20 秒并不断重复这个周期。
游戏管理员:
void Start()
{
StartFireWaves();
}
public void StartFireWaves()
{
StartCoroutine(wm.SelectWave());
}
Wave 经理:
public IEnumerator SelectWave()
{
float waitFor;
float diff = 0;
diff = nextWaveAT - Time.time;
if (diff <= 0f)
{
SpawnFlames();
waitFor = Random.Range(15, 20);
}
nextWaveAT = nextWaveAT + waitFor;
yield return new WaitForSeconds(waitFor);
}
SpawnFlames:
void SpawnFlames()
{
float val = Random.value;
if (val < .25f)
{
Wave1();
}
if (val >= .25f && val < .5f)
{
Wave2();
}
if (val >= .5f && val < .75f)
{
Wave3();
}
else
{
Wave4();
}
}
我假设它应该是这样工作的,但它似乎并没有保持 "updating" 或 运行ning。它只是 运行 一次,然后什么也没有发生。
使用 Coroutine
和多个嵌套 while
循环来执行此操作。第一个 while
循环是让它永远 运行 直到调用 stopRunningWaves() 函数。第二个 while
循环用于 运行 波 x 时间量然后跳回到第一个 while
循环。
bool keepRunningWaves = false;
IEnumerator startingRunningWaves(float second = 20)
{
if (keepRunningWaves)
{
yield break;
}
keepRunningWaves = true;
while (keepRunningWaves)
{
float timer = 0;
int randWave = Random.Range(1, 5);
while (timer < second)
{
if (!keepRunningWaves)
{
yield break;
}
if (randWave == 1)
{
Debug.Log("Running Wave 1");
Wave1();
}
else if (randWave == 2)
{
Debug.Log("Running Wave 2");
Wave2();
}
else if (randWave == 3)
{
Debug.Log("Running Wave 3");
Wave3();
}
else if (randWave == 4)
{
Debug.Log("Running Wave 4");
Wave4();
}
timer += Time.deltaTime;
yield return null;
}
//Reset Timer for next run
timer = 0;
yield return null;
}
keepRunningWaves = false;
}
void stopRunningWaves()
{
keepRunningWaves = false;
}
要进行测试,请使用 3 秒来完成,这样可以节省您的时间:
StartCoroutine(startingRunningWaves(3));