现如今,Unity中的协程(Coroutine)方案已显得老旧,而Unitask等异步方案可以直接解决如异常捕获等各类问题。此外,Unity官方也在开发一套异步方案,但目前仍需要在协程这个方案上继续琢磨。
Unity协程中无法输出完整的栈跟踪,因为协程编译后会转换为IL编码的状态机,中间存在栈回到堆的过程。因此,在有多个yield函数嵌套的协程中出现报错时,栈信息会是缺失的,仅显示“栈信息丢失”。为了更好地解决这个问题,需要重新封装MoveNext()或采用Unitask。然而,这样做会增加代码的复杂度。经过摸索后,发现还存在一些可行的途径。
抖个机灵,如果在非yield语句中进行常规代码的调用或函数调用,则可正常拿到类名和代码行数。
打印:
14
19
24
下面将基于这个思路继续扩展。
若这样的话,每一步协程函数跳转都要用Begin、End语句包装又太丑。
这样调用时就舒服多了,对原始代码的改动也最小。
不过还需要处理函数结束时调用Pop方法,这个可以结合using语法糖使用。
最终调用时如下:
最终效果如下: