工具源碼: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的字節流發給手機,手機收到消息后加載程序集即可。