赞
踩
之前一直有听说热更新技术,于是找点时间来研究一下热更新技术的使用。热更新的实现方式有很多种,这里笔者记录一下自己学习HybirdCLR的过程。
unity2021.3.10f1c2,visual studio 2019
下载官方示例后,按照readme文档说的进行操作:
HybridCLR/Generate/All
一键执行必要的生成操作HybridCLR/Build/BuildAssetsAndCopyToStreamingAssets
打包热更新资源及dllAssets/StreamingAssets
下的所有文件复制到你刚才打包的游戏的StreamingAssets目录(如果是直接打android apk包,则再次Build即可)有个UGUI的text,显示热更新程序集的脚本中方法返回的字符串
void StartGame()
{
LoadMetadataForAOTAssemblies();
ass = System.Reflection.Assembly.Load(GetAssetData("Assembly-CSharp.dll"));
var klass = ass.GetType("SaySth");
var method = klass.GetMethod("SayHello");
string str = (string)method.Invoke(null, null);
textMeshPro.text = str;
}
当然你得在Assembly-CSharp中先创建个脚本:
using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class SaySth : MonoBehaviour { public static string SayHello() { string tes = "hello,world"; //string tes = "---------hello,world"; //Debug.Log(tes); return tes; } }
using HybridCLR.Editor.Commands; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEditor; using UnityEngine; namespace HybridCLR.Editor { public static class BuildAssetsCommand { [MenuItem("HybridCLR/Build/BuildAndCopyAOTHotUpdateDllsToStreamingAssets")] public static void BuildAndCopyAOTHotUpdateDlls() { BuildTarget target = EditorUserBuildSettings.activeBuildTarget; CompileDllCommand.CompileDll(target); CopyAOTHotUpdateDlls(target); } public static void CopyAOTHotUpdateDlls(BuildTarget target) { CopyAOTAssembliesToStreamingAssets(); CopyHotUpdateAssembliesToStreamingAssets(); } /// <summary> /// 元数据dll名称,为了解决AOT泛型问题 /// </summary> public static List<string> AOTMetaAssemblyNames { get; } = new List<string>() { "mscorlib.dll", "System.dll", "System.Core.dll", }; /// <summary> /// 把AOT元数据丢到streamingasset /// </summary> public static void CopyAOTAssembliesToStreamingAssets() { var target = EditorUserBuildSettings.activeBuildTarget; string aotAssembliesSrcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target); string aotAssembliesDstDir = Application.streamingAssetsPath; foreach (var dll in AOTMetaAssemblyNames) { string srcDllPath = $"{aotAssembliesSrcDir}/{dll}"; if (!File.Exists(srcDllPath)) { Debug.LogError($"ab中添加AOT补充元数据dll:{srcDllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成,因此需要你先构建一次游戏App后再打包。"); continue; } string dllBytesPath = $"{aotAssembliesDstDir}/{dll}.bytes"; File.Copy(srcDllPath, dllBytesPath, true); Debug.Log($"[CopyAOTAssembliesToStreamingAssets] copy AOT dll {srcDllPath} -> {dllBytesPath}"); } } /// <summary> /// 将热更新dll改名,丢到streamingasset /// </summary> public static void CopyHotUpdateAssembliesToStreamingAssets() { var target = EditorUserBuildSettings.activeBuildTarget; string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target); string hotfixAssembliesDstDir = Application.streamingAssetsPath; foreach (var dll in SettingsUtil.HotUpdateAssemblyFiles) { string dllPath = $"{hotfixDllSrcDir}/{dll}"; string dllBytesPath = $"{hotfixAssembliesDstDir}/{dll}.bytes"; File.Copy(dllPath, dllBytesPath, true); Debug.Log($"[CopyHotUpdateAssembliesToStreamingAssets] copy hotfix dll {dllPath} -> {dllBytesPath}"); } } } }
来回切换Assembly-CSharp.dll.bytes时,笔者发现有时候文本没有更新。查看IIS缓存配置,然后修改了IIS如下,这样切换bytes文件后,可以及时更新了。
最后要感谢一下群里大佬们的耐心教导,这个群非常的好,人多说话又好听,新手群号
428404198
有时间的话建议再看看官方文档里面对原理的描述,深刻理解一下与其他主流热更新框架的区别。
热更新的基础知识,以及一些主流热更新框架介绍
HybridCLR/huatuo,GitHub
unity中的AOT、JIT、IL2CPP、Mono
unity程序集——类似DLL,能够把unity工程中的脚本划分到不同的程序集
HybridCLR官方文档
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。