如何阻止在游戏对象数组上运行的几个协同程序

时间:2017-07-19 22:32:30

标签: c# unity3d unity5

在下面的代码中,我在游戏对象数组的每个元素上运行一个协同程序。如何停止在每个游戏对象上运行FadeToForEnemy协程?

 IEnumerator EnemyCycle()    {
while (isRepeating)
{

    for (int j = 0; j < enemies.Length; j++) {

        Enemy currentEnemy = enemies [j];
        var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
        var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 0f, 1f, currentEnemy.gameObject, false));

    }

    yield return new WaitForSeconds (hdTime);

    for (int j = 0; j < enemies.Length; j++) {

        Enemy currentEnemy = enemies [j];
        var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
        var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 1f, 1f, currentEnemy.gameObject, true));

    yield return new WaitForSeconds (srTime);

    }
}
}

我尝试在下面停止协同程序,但是渐渐消失的循环继续。

public void StopEnemyCycles ()  {
for (int i = 0; i < enemies.Length; i++) {
    enemies [i].StopAllCoroutines ();
}
StopCoroutine ("EnemyCycle");

}

3 个答案:

答案 0 :(得分:1)

我发现了一个问题,但不确定是否是造成问题的原因。

第二个yield语句:yield return new WaitForSeconds (srTime);似乎在for循环的闭括号之前。那就是你的代码在敌人数组的元素之间暂停并启动协程。

我认为在您使用enemies [i].StopAllCoroutines ();停止所有协程后,循环仍在进行并启动新循环

答案 1 :(得分:0)

您正在使用一种行为调用StartCoroutine,然后尝试通过对其他行为(敌人)使用StopAllCoroutines来停止它。您需要确保启动并停止相同的对象。

尝试调用敌人循环器对象中的所有协程,或者在敌人脚本中移动枚举器和启动协程调用。

答案 2 :(得分:0)

通常调用StopAllCoroutines()会起作用,但你必须调用与启动协程相同的行为。

而不是

for (int i = 0; i < enemies.Length; i++) {
    enemies [i].StopAllCoroutines ();
}

直接使用

StopAllCoroutines();

这是一种方式,但我宁愿通过StopCoroutine(Coroutine routine);停止协同程序 StartCoroutine(..)返回Coroutine,因此将所有Coroutines保存到数组中。然后在每个上使用StopCoroutine。

List<Coroutine> coroutinesToStop = new List<Coroutine>();
    IEnumerator EnemyCycle()    {
while (isRepeating)
{

for (int j = 0; j < enemies.Length; j++) {

    Enemy currentEnemy = enemies [j];
    var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
    var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 0f, 1f, currentEnemy.gameObject, false));
    coroutinesToStop.Add(_currentFade);
}

yield return new WaitForSeconds (hdTime);

for (int j = 0; j < enemies.Length; j++) {

    Enemy currentEnemy = enemies [j];
    var _myMaterial = currentEnemy.GetComponent<Renderer>().material;
    var _currentFade = StartCoroutine(FadeToForEnemy(_myMaterial, 1f, 1f, currentEnemy.gameObject, true));
    coroutinesToStop.Add(_currentFade);
yield return new WaitForSeconds (srTime);

    }
}

public void StopEnemyCycles ()  {
for (int i = 0; i < coroutinesToStop.Count; i++) {
    if(coroutinesToStop != null)
         StopCoroutine (coroutinesToStop[i]);
}
coroutinesToStop.Clear();
StopCoroutine ("EnemyCycle");

}