在下面的代码中,我在游戏对象数组的每个元素上运行一个协同程序。如何停止在每个游戏对象上运行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");
}
答案 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");
}