如何在 Unity 中仅停止某些协程实例

Posted

技术标签:

【中文标题】如何在 Unity 中仅停止某些协程实例【英文标题】:How do I stop only some instances of a coroutine in Unity 【发布时间】:2021-11-15 03:17:02 【问题描述】:

我正在制作一个 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;
        
    

这就是我的 FadeOut 协程(FadeIn 脚本就是这个完全一致的协程,但相反)。问题在于它会出错。例如,如果我多次进入和退出需要淡出的区域,整个游戏只会混合黑色(或太亮)。我通过使用 StopAllCoroutines 函数解决了这个问题。 协程调用之一:

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

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

我尝试使用 StopCoroutine("name") (但据我所知,它与较新版本的统一不兼容)。 我还在 *** 上获得了另一个线程

来自线程的代码:

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

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

我该如何解决这个问题?

【问题讨论】:

@derHugo 是的,我完全知道。我在网上搜索了那个东西,统一确实使用了“名称”而不是实例(或者是网络上的一些欺骗性响应)。我还尝试保存 Coroutine 的实例 (请参阅我在帖子中链接的最后一个代码),但效果不佳。当多个实例同时运行时,并非所有实例都会被StopCoroutine(routine);关闭 为了进一步帮助特定的实现...在StopCoroutine(routine); 中显示实际代码...routine 是什么,它来自哪里? 【参考方案1】:

那个

来自线程的代码

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

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

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);

【讨论】:

以上是关于如何在 Unity 中仅停止某些协程实例的主要内容,如果未能解决你的问题,请参考以下文章

Unity在协程内部停止协程自身后代码执行问题

Unity3D停止不了协程

Unity 之 关于停止协程的五种方式解析

Unity 之 关于停止协程的五种方式解析

如何从 OnTriggerStay 协程中启动和停止其他协程

Unity怎么暂停协程✨Unity协程管理方案