Unity协程延迟重置_isActive失败,疑为作用域问题?
问题:Coroutine延迟后未重置私有变量_isActive的排查
嘿,我来帮你看看这个问题!首先可以明确说,这不是作用域问题——你的_isActive是类级别的私有变量,Coroutine里完全可以访问到它。真正的问题出在你对Coroutine实例的复用方式上。
先拆解下你的代码逻辑问题:你在Awake()里就创建了一个MyDelay()的Coroutine实例并存在coroutine变量里,之后每次事件触发都调用StartCoroutine(coroutine)。但Unity的Coroutine有个关键规则:同一个Coroutine实例只能被启动一次。第一次触发事件时,这个Coroutine会正常执行,延迟2秒后重置_isActive;但如果事件再次触发,调用StartCoroutine传入同一个已运行(或已完成)的Coroutine实例,Unity会直接忽略这个启动请求,导致后续的延迟操作根本不会执行。
下面给你两种简单的修复方案:
方案1:每次触发事件时创建新的Coroutine实例
不需要提前存储Coroutine对象,每次事件触发时直接创建并启动新的实例:
using UnityEngine; using System.Collections; using System; bool _isActive; void Awake() { _isActive = false; } private bool MyEventhandler(IEvent evt) { StartCoroutine(MyDelay()); // 每次都创建新的Coroutine实例 _isActive = true; Debug.Log("Yes event received"); return true; // 补上方法声明要求的返回值 } IEnumerator MyDelay() { yield return new WaitForSeconds(2.0f); Debug.Log("Yes delay complete"); _isActive = false; // 现在能正常重置变量了 } void Update(){ Debug.Log(" _isActive = " + _isActive); }
方案2:控制Coroutine的启停(防止重复触发)
如果担心短时间内多次触发事件导致多个Coroutine同时运行,可以先停止之前的Coroutine再启动新的:
using UnityEngine; using System.Collections; using System; IEnumerator coroutine; bool _isActive; void Awake() { _isActive = false; } private bool MyEventhandler(IEvent evt) { // 若已有Coroutine在运行,先停止它 if (coroutine != null) { StopCoroutine(coroutine); } coroutine = MyDelay(); StartCoroutine(coroutine); _isActive = true; Debug.Log("Yes event received"); return true; } IEnumerator MyDelay() { yield return new WaitForSeconds(2.0f); Debug.Log("Yes delay complete"); _isActive = false; coroutine = null; // 执行完毕后清空引用 } void Update(){ Debug.Log(" _isActive = " + _isActive); }
这样修改后,每次事件触发都会确保有一个有效的Coroutine在运行,延迟结束后_isActive就会被正常重置了。另外注意,你的原代码里MyEventhandler方法声明返回bool但没有返回语句,这会导致编译错误,记得补上返回值哦。
内容的提问来源于stack exchange,提问作者Bachalo
相关产品推荐
相关产品推荐

