我如何在Unity中只停止一些协同程序的实例



我正在制作一款2d游戏,我需要淡出一些元素。

IEnumerator FadeOut(Renderer rend, float speed)
{
while (rend.material.color.a > 0)
{
Color objectColor = rend.material.color;
float fadeAmount = objectColor.a - (speed * Time.deltaTime);
objectColor = new Color(objectColor.r, objectColor.g, objectColor.b, fadeAmount);
rend.material.color = objectColor;
yield return null;
}
}

这是我的淡出协程(淡出脚本是这个确切的协程,但相反)。这样做的问题是它会出错。例如,如果我多次进入和退出一个需要淡出的区域,整个游戏就会混合成黑色(或太亮)。我通过使用StopAllCoroutines解决了这个问题函数。其中一个协程调用:

StopAllCoroutines();
StartCoroutine(FadeOut(tilemap,1f));

我宁愿不使用StopAllCoroutines,因为我在同一游戏中使用多个协程,进入淡出区域只会关闭一半的系统。

我尝试使用StopCoroutine("name")(但据我所知,它与新版本的unity不兼容)。我还在StackOverflow上找到了另一个线程

来自线程的代码:

routines[col] = StartCoroutine((DamageEverySecond(health, damageRate)));
[...]
StopCoroutine(routine);

不幸的是,这并不能解决我的问题,因为有多个实例同时运行。

我该如何解决这个问题?

线程代码

routines[col] = StartCoroutine((DamageEverySecond(health, damageRate)));
[...]
StopCoroutine(routine);

代码使用"name"..它使用StartCoroutine返回的Coroutine实例,这正是您想要做的:

private Coroutine fadeOutRoutine;

那么当你开始一个的时候,你就做。

fadeOutRoutine = StartCoroutine(FadeOut(tilemap,1f));

,你可以使用

停止它
StopCoroutine(fadeOutRoutine);

或者如果有很多例程可以执行

private List<Coroutine> fadeOutRoutines;

那么当你开始一个的时候,你就做。

fadeOutRoutines.Add(StartCoroutine(FadeOut(tilemap,1f)));

,您可以使用

停止特定的例程(例如,上次启动的例程)
var index = fadeOutRoutines.Count - 1;
StopCoroutine(fadeOutRoutines[index]);
fadeOutRoutines.RemoveAt(index);

最新更新