Huatuo|01 基础使用
项目配置
huatuo 由两部分构成il2cpp_huatuo 仓库和huatuo 仓库
il2cpp_huatuo 仓库基于 unity 原始 il2cpp 作了少量修改(几百行),使得它可以支持动态注册元数据,进行可以动态加载 dll
huatuo 仓库是 huatuo 的核心源代码
注意,il2cpp部分需要和unity版本契合,版本对应关系如图
上面两部分并不用下载,我们到这里,下载示例工程
然后进入项目的HuatuoData目录,这里存放了所有插件相关的东西
其实都是git/svn相关的一些快捷指令,我们不使用这些指令自己手动克隆仓库也是可以的,但偷懒直接用指令吧
首先我们初始化仓库,bat是git命令,sh是svn命令,自己选择合适的就好
运行init_huatuo_repos.bat,克隆到下面两个文件夹
然后我们设置一下分支版本,选择的版本一定要和你使用的unity版本一致,在这里我们选用2020.3.33
然后我们运行init_local_il2cpp_data.bat扩展il2cpp插件,但是,我们需要先右键编辑文件 这个路径应该是对应你本地unity版本的路径,图里是2020.3.18,我们应该改成本地3.33版本的路径,然后运行
然后就可以用目标版本的unity打开项目啦
项目流程简介
打开脚本LoadDll
void Start()
{
BetterStreamingAssets.Initialize();
LoadGameDll();
RunMain();
}
- BetterStreamingAssets 一个访问StreamingAssets的插件,更高效安全,当然不在ht范围内,我们不关心
- LoadGameDll 加载Dll
- RunMain 运行
private void LoadGameDll()
{
AssetBundle dllAB = AssemblyAssetBundle = BetterStreamingAssets.LoadAssetBundle("common");
#if !UNITY_EDITOR
TextAsset dllBytes1 = dllAB.LoadAsset<TextAsset("HotFix.dll.bytes");
System.Reflection.Assembly.Load(dllBytes1.bytes);
TextAsset dllBytes2 = dllAB.LoadAsset<TextAsset("HotFix2.dll.bytes");
gameAss = System.Reflection.Assembly.Load(dllBytes2.bytes);
#else
gameAss = AppDomain.CurrentDomain.GetAssemblies().First(assembly => assembly.GetName().Name == "HotFix2");
#endif
GameObject testPrefab = GameObject.Instantiate(dllAB.LoadAsset<UnityEngine.GameObject>("HotUpdatePrefab.prefab"));
}
首先我们加载common AssetBundle包 然后 如果我们在编辑器模式,我们直接通过AppDomain获得当前所有程序集,并找到名称为HotFix2的 如果我们在真机模式,那么是通过加载AB包然后再读取我们打包的DLL 然后架子啊了一个Prefab
public void RunMain()
{
if (gameAss == null)
{
UnityEngine.Debug.LogError("dll未加载");
return;
}
var appType = gameAss.GetType("App");
var mainMethod = appType.GetMethod("Main");
mainMethod.Invoke(null, null);
这里就很简单了,就是找到App类的Main方法,执行一下,我们可以看一下这个方法
总结一下,在编辑器模式那就是直接找到程序集然后运行,不重要,而在真机模式中,同样是通过AB包读取dll资源然后进行的热更,热更只需要替换新的AB包就好了,所以热更新的流程就是:编译DLL、打AB包、替换旧的AB包,很简单
热更新测试
首先编译DLL
然后打AB包
然后打包,注意一些打包设置
有两个注意点
- 其实直接打AB也会进行编译(不过从流程上来说就应该先编译的)
- 在第一次打包项目之前,打AB会出错,具体原因还不清楚,涉及裁剪问题,待研究(反正只要先打包一次项目之后就好了)
打包之后运行一下项目
然后我们修改一下App中的方法,随便加一点
public class App
{
public static int Main()
{
...
Debug.Log("hello, huatuo");
Debug.Log("hello world"); // 新加的
...
}
}
打一下AB包,用StreamingAsset下新的AB包替换打包目录下的AB包,打包目录的AB包位置位于huatuo_Data/StreamingAssets
再次运行
热更成功!