ILSpy反编译Unity协程
2017-03-30 01:18
821 查看
问题分析
直接用ILSpy或类似工具反编译出的C#脚本里协程(Coroutine)和编写时明显不同:无参数协程示例:
private IEnumerator startCt_result() { ScGame.<startCt_result>c__IteratorE <startCt_result>c__IteratorE = new ScGame.<startCt_result>c__IteratorE(); <startCt_result>c__IteratorE.<>f__this = this; return <startCt_result>c__IteratorE; }带参数协程示例:
private IEnumerator FreeRun(float holdTime) { NinjaMovementScript.<FreeRun>c__IteratorD <FreeRun>c__IteratorD = new NinjaMovementScript.<FreeRun>c__IteratorD(); <FreeRun>c__IteratorD.holdTime = holdTime; <FreeRun>c__IteratorD.<$>holdTime = holdTime; <FreeRun>c__IteratorD.<>f__this = this; return <FreeRun>c__IteratorD; }可以看出编译器将C#编译为IL时候将yield return XXX这样的语法糖展开成为一个自动生成的类,默认设置下这个类并不能直接在ILSpy里看到,在ILSpy里选择View -> Options,取消勾选Decompile enumerators后就能看到这个自动生成的类。
示例代码如下(对应带参数的协程示例):
[CompilerGenerated] private sealed class <FreeRun>c__IteratorD : IEnumerator, IDisposable, IEnumerator<object> { internal float holdTime; internal int $PC; internal object $current; internal float <$>holdTime; //这个holdTime应该是检测WaitForSeconds是否完成用的 internal NinjaMovementScript <>f__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return this.$current; } } object IEnumerator.Current { [DebuggerHidden] get { return this.$current; } } public bool MoveNext() { uint num = (uint)this.$PC; this.$PC = -1; switch (num) { case 0u: this.$current = new WaitForSeconds(this.holdTime); this.$PC = 1; return true; case 1u: this.<>f__this.Freezz = false; this.$PC = -1; break; } return false; } [DebuggerHidden] public void Dispose() { this.$PC = -1; } [DebuggerHidden] public void Reset() { throw new NotSupportedException(); } }显然这是一个将代码块yield return语句展开后生成的迭代器状态机类,yield return是C# 2提供的语法糖,避免了C# 1时代手动编写状态机的过程。因此我们可以轻易的分析出yield return语句应该是:
IEnumerator FreeRun(float holdTime) { yield return new WaitForSeconds(this.holdTime); this.Freezz = false; //脚本NinjaMovementScript的字段 }
参考资料
1.《C# in Depth》3rd Edition。相关文章推荐
- 【Unity3D基础教程】给初学者看的Unity教程(五):详解Unity3D中的协程(Coroutine) - 王选易
- unity 协程笔记
- Unity 协程运行时的监控和优化
- 如何使用dnSpy反编译unity代码并修改
- Unity协程(Coroutine)原理深入剖析
- Unity杂谈——Unity中的协程(协同程序)
- Unity引擎在执行协程(Coroutine)的原理
- ILSpy[.NET]反编译工具
- Unity协程(Coroutine)原理深入剖析
- 【Unity】协程原理与线程的区别
- Unity协程(Coroutine)原理深入剖析
- Unity协程(Coroutine)原理深入辨析
- Unity协程(Coroutine)原理深入剖析
- 关于Unity中协程、多线程、线程锁、www网络类的使用
- Unity 3D协程
- unity使用协程实现打字效果
- 【Unity优化】如何实现Unity编辑器中的协程
- Unity入门操作_协程_023
- unity 协程 详细说明
- unity中的简单的协程用法。