工具源码:https://github.com/handzlikchris/FastScriptReload
介绍
- 用于运行时修改C#后能快速重新编译C#并生效,避免每次改C#,unity全部代码重新编译,耗时旧且需要重启游戏。
使用
-
需要手动调整AssetPipeline自动刷新模式,即改成运行时不要自动刷新资源,同时意味着:
-
运行时改shader代码不会及时生效,如果主要调试shader,还是要开运行时刷新。
-
运行时window下改工程资源,unity不会刷新,比如外部新增一张图,unity不会刷新显示。
-
原理
-
FastScriptReloadManager
中EditorApplication.update
每帧检查所有配置的*.cs
文件System.IO.FileSystemWatcher.Changed
提供文件变化时事件
-
对变化的C#文件重新创建C#文件
- 对原来C#文件语法分析,对新增变量和方法另外封装,对修改的变量不用另外处理。类似将新增的变量存到他一个临时字典里,访问就到他的字典里取。生成
.SourceCodeCombined.cs
文件
-
生成
.rsp
文件,包含编译需要的一些信息。
-
使用.net命令和csc.dll工具编译C#代码为DLL文件。
- 对原来C#文件语法分析,对新增变量和方法另外封装,对修改的变量不用另外处理。类似将新增的变量存到他一个临时字典里,访问就到他的字典里取。生成
-
安卓环境的话,这里会把dll转成字节流发给手机,手机收到后下面流程一致。
-
使用
System.Reflection.Assembly.LoadFrom
加载DLL文件。 -
AssemblyChangesLoader.DynamicallyUpdateMethodsForCreatedAssembly
对所有已存在的C#方法,重定向到新的C#方法:Memory.DetourMethod
,即把旧的函数指针指向新的函数。
安卓环境测试
- 原理和上面一致,只是多了层网络收发,即把DLL的字节流发给手机,手机收到消息后加载程序集即可。