如何实现Unity协程的完整栈跟踪?

摘要:现如今Unity中的协程(Coroutine)机制已略显陈旧,随着Unitask、ETTask等异步方案的崭露头角,诸如协程异常等问题也迎刃而解 并且Unity官方也在开发一套异步方案,但对于仍使用协程的项目,依旧需要在这个方案上继续琢磨。
现如今Unity中的协程(Coroutine)机制已略显陈旧,随着Unitask、ETTask等异步方案的崭露头角,诸如协程异常等问题也迎刃而解 并且Unity官方也在开发一套异步方案,但对于仍使用协程的项目,依旧需要在这个方案上继续琢磨。 众所周知Unity协程中无法输出完整的栈跟踪,因为协程编译后会转换为IL编码的状态机,中间存在栈回到堆的过程,因此 假如在有多干yield函数嵌套的协程中出现报错,看到的栈信息会是缺失的: public class TestClass : MonoBehaviour { private void Start() { StartCoroutine(A()); } private IEnumerator A() { yield return B(); } private IEnumerator B() { yield return C(); yield return null; } private IEnumerator C() { yield return null; Debug.Log("C"); } } 输出(栈信息丢失): C UnityEngine.Debug:Log (object) TestClass/<C>d__3:MoveNext () (at Assets/TestClass.cs:31) UnityEngine.SetupCoroutine:InvokeMoveNext (System.Collections.IEnumerator,intptr) 若要比较好的解决这个问题,是不是只能拿到MoveNext()重新封装或采用Unitask。 不过那样就太重了,经过摸索后发现,还是存在一些可行的途径。
阅读全文