Lua热更新原理
利用第三方Lua热更新库,在Unity中嵌入lua解释器,利用解释器执行lua脚本。需要热更新的时候,从服务器上下载需要更新的代码文件
为什么要用lua做热更新,而不用C#?
C#语言本身是一种静态编译语言,它的代码在编译时会被转换成机器码,然后才能被计算机执行。这种静态编译的特性使得C#在运行时无法直接修改已编译的代码。另外,C#语言在运行时使用的是Common Language Runtime (CLR)环境,CLR负责将C#代码转换成可执行的机器码。CLR在运行时会对代码进行各种优化和安全检查,这些优化和检查过程也使得热更新变得困难。
Lua是一种动态脚本语言,它的代码在运行时会被解释器逐行执行,而不需要进行静态编译。这种动态性使得Lua可以在运行时修改已加载的代码,实现热更新。具体来说,Lua的解释器可以在运行时动态加载新的脚本文件,并替换已加载的代码模块。这种动态加载和替换的机制使得Lua可以实现热更新,即在程序运行过程中修改和更新代码,而无需重新启动整个程序。
其次,C#不能打包成AB包,而Lua可以,Lua结合AB包使用起来非常方便。
C#能不能实现热更新?
可以,利用反射实现
反射是什么?
C#反射是指在运行时动态地获取和操作程序集、类型、成员等信息的机制。通过反射,可以在运行时通过程序集中的元数据来实例化对象、调用方法、获取和设置属性等,而不需要在编译时明确知道这些类型和成员的具体信息,主要用到Type,Assembly,Activator三个类,这里不过多赘述,详细内容可以自行学习。C#反射实现热更新
将需要频繁更改的逻辑部分独立出来做成DLL(动态链接库(Dynamic Link Library),可以包含类,函数等资源,让其他程序动态加载使用),通过反射机制加载这些DLL,主模块代码不作修改,热更新时用新的dll替换旧的dll,主模块加载dll就起到了更新的效果。不过c#反射只适用于Android热更新,iOS因为自身的安全机制,新申请的内存空间(用于修改后的代码使用)不允许进行写操作,所以目前c#的反射基本不被商业项目用作热更新。