前项目的C#热更方案
小甜甜的C#热更方案
前段时间 noodle 说他把 小甜甜 项目中他做的 C#热更方案 开源了。
这个方案是一个 骚操作,不过是针对 il2cpp 的,核心思想是更新 libil2cpp.so,具体细节可以参考 github主页。
暗黑血统的C#热更方案
再早一点的项目 暗黑血统,那还是 Unity4 的时代,我们的C#热更方案也是一个 骚操作,这里列一下要点:
-
Assembly-CSharp-firstpass.dll 和 Assembly-CSharp.dll 是Unity预定的2个程序集。
-
Assembly-CSharp-firstpass.dll 包括了加载热更代码的代码,不可被热更新,Assembly-CSharp.dll 包括主要的游戏逻辑代码,期望可以被热更新。
-
打包的时候,把 Assembly-CSharp.dll 中的代码移动到我们自定的 GameLogic.dll 中,并把 Assembly-CSharp.dll 清空(namespace颠倒)。
-
运行的时候,Assembly-CSharp-firstpass.dll 中的代码通过 Assembly.Load 的方式去加载 GameLogic.dll,GameLogic.dll 可以从服务器下载获取,以此达到热更新的目的。
这样做看起来OK,但是有一个很大的限制: 预设不能挂载非firstpass目录的脚本,原因可以参考这篇帖子。 当然,我们可以在运行时通过 AddComponent 的方式去挂载脚本,但是这样做限制较大。
骚操作 之所以被称为 骚操作,就是我们可以打破这个限制:即把 Assembly-CSharp.dll 换成了 GameLogic.dll 后,也要保证预设能够找得到原先引用的脚本。
暗黑血统 的做法是:在生成GameLogic.dll后,改cs文件对应的meta文件,把dll重新定向到GameLogic.dll,重启编辑器再打包。