工具介绍
ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等
HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。
xasset 是专业的Unity资源系统。
xasset 提供开箱即用的打包、分包、加密、边玩边下和跨平台加载等技术让Unity项目的开发更快更轻松!
ET-EUI (在文章发布时,ET-GUI作者已匹配到ET-7.0,文章中将以此为基础修改匹配到ET-7.2)
ET-EUI是基于ET框架的简单UI模块
搭建流程
- ET
- 从github上下载ET 7.2 版本 ,用Unity打开工程中名字为Unity的项目目录。
操作步骤可以参考 ET6.0框架-开发环境搭建,以及Book目录下的最新 运行指南.md 。
- 切换到Anroid平台
- 修改Mongo相关Dll的"Select platforms for plugin"属性设置:
否则会在在点击"BuildModelAndHotfix"命令后,出现找不到相关Mongo dll的报错:
(Assets\Scripts\Codes\Model\Server\Module\DB\DBComponent.cs(1,15): error CS0234: The type or namespace name 'Driver' does not exist in the namespace 'MongoDB' (are you missing an assembly reference?) (at DBComponent.cs))
- 运行工程前,需要执行"BuildModelAndHotfix"命令来编译代码及启动内置服务器(选择ClientServer模式);如果需要单独运行服务器,选择Client模式,再参考文档 运行指南.md 中的说明单独启动服务器。
- 编译成功后,就可以正常启动了。
- HybridCLR
- 在安装好ET后,再按照官方的教程 安装HybridCLR | Focus Creative ,来添加HybridCLR package,然后再进行安装:
-
下载官方的 HybridCLR 示例项目 工程,把Assets目录里的所有文件拷贝到ET工程里Unity的Assets目录里,然后打开其中的main场景。
- 在启动演示场景前,需分别执行以下命令操作;
执行完毕后,正常是会在StreamingAssets目录生成以下文件:
如果没有生成以上全部文件或者遇到需要先打包的提示,则需要打包一次apk后再重新执行命令操作。最后生成上图的文件列表后,就能正常启动了。
- XAsset 2022.2 免费版
XAsset 的安装简单,直接导入安装package就可以了, 详情可浏览 官方文档,这里简单说一下需要注意的使用事项:
- 2022.2版本较2022.1版本做了很多改动,首先从打包导出的版本控制文件上,从原来的两个文件(manifest.json, versions_v?.json)增加到2+n个文件(updateinfo.json,versions_v?.json,[资源分类文件.json,...] ),且资源分类文件是通过配置生成的,省去了为资源自定义assetbundle名字的操作。
- 2022.2版本中已将文件断点续传功能从原生C#代码改成通过UnityWebRequest来实现。
在实现的下载逻辑中涉及两次请求:一次是获取文件的大小等信息,一次是下载文件的内容。当通过CDN下载如json等格式的文本配置文件时,如果在CDN上是使用对象存储方式存放这类文件时,在通过UnityWebRequest请求获取文件的大小信息时,有可能获得的不是正确的大小数值,可通过HttpWebRequest的方式获取正确文件信息:
- ET-EUI
- ET-EUI7.0版本当前还是基于ET6.x框架的目录结构,要放到ET7.2框架中使用需要手动将相关的EUI代码目录 (如
ET-EUI_70\Unity\Codes\ModelView\Module\EUI,
ET-EUI_70\Unity\Codes\HotfixView\Module\EUI,
ET-EUI_70\Unity\Assets\Editor\EUI,
ET-EUI_70\Unity\Assets\Mono\LoopScrollRect等)
拷贝到ET7.2框架对应的目录(如
ET_72\Unity\Assets\Scripts\Codes\HotfixView\Client\Module\EUI,
ET_72\Unity\Assets\Scripts\Codes\ModelView\Client\Module\EUI,
ET_72\Unity\Assets\Scripts\Editor\EUI,
ET_72\Unity\Assets\Scripts\Core\Module\EUI等)
- 直接拷贝完毕后,由于ET7.2框架的目录结构更新,会出现一些重复的文件,需要检查差异并整合,删除不需要的同名文件。
- 另外ET7.2框架有一些属性定义类的名字也发生了改变,比如FriendClassArrbite 改为 FriendOfAttribute, ChildTypeAttribute改为ChildOfAttribute等,相应的也需要同步更新EUI的UICodeSpawner代码中自动生成UI类的定义逻辑。
ET 通过 HybridCLR 生成并加载 热更代码
- 添加ET 宏定义 ENABLE_CODES
- 将ET热更模块的平台属性 改成 全平台
- 在HybridCLR Settings中添加需要热更的Assembly Definitions
- 参照HybridCLR的 BuildAndCopyABAOTHotUpdateDlls命令实现一个新的BuildETAssetsAndCopyToStreamingAssets命令
- 执行ET的BuildPackage命令打包资源,资源会存放StreamingAssets目录下
- 再依次执行HybridCLR的三个命令生成热更代码,执行成功后,生成的文件也存放在StreamingAssets目录下
- 参考HybridCLR的LoadDll.cs文件中加载热更代码的逻辑 以及 ET的CodeLoader.cs文件中启动热更代码的逻辑,实现加载ET的HybridCLR热更逻辑。
System.Collections.IEnumerator DownLoadAssets(Action onDownloadComplete) { var assets = HotfixDll.Concat(AOTMetaAssemblyNames); foreach (var asset in assets) { string dllPath = GetWebRequestPath(asset); Debug.Log($"start download asset:{dllPath}"); UnityWebRequest www = UnityWebRequest.Get(dllPath); yield return www.SendWebRequest(); #if UNITY_2020_1_OR_NEWER if (www.result != UnityWebRequest.Result.Success) { Debug.Log(www.error); } #else if (www.isHttpError || www.isNetworkError) { Debug.Log(www.error); } #endif else { // Or retrieve results as binary data byte[] assetData = www.downloadHandler.data; Debug.Log($"dll:{asset} size:{assetData.Length}"); s_assetDatas[asset] = assetData; } } onDownloadComplete(); }
void StartGame() { LoadMetadataForAOTAssemblies(); List<Assembly> listAssembly = new List<Assembly>(); foreach (var item in HotfixDll) { byte[] assModelBytes = GetAssetData(item); var assembly = Assembly.Load(assModelBytes); if (item == "Unity.Model.Codes.dll") { this.model = assembly; } listAssembly.Add(assembly); } listAssembly.Add(typeof(Game).Assembly); listAssembly.Add(typeof(Init).Assembly); Dictionary<string, Type> types = AssemblyHelper.GetAssemblyTypes(listAssembly.ToArray()); EventSystem.Instance.Add(types); IStaticMethod start = new StaticMethod(this.model, "ET.Entry", "Start"); start.Run(); }
- 生成Apk包,在手机或模拟器启动程序测试热更(启动后日志显示了一个错误,原因是把服务器的代码也添加到热更代码里了,后续只需要将Hotfix和Model的Server代码定义在新的Assembly里就可以了)
整个工程代码和涉及HybridCLR需要修改的UnityEditor.CoreModule.dll文件(放在工程的Tools目录里)都放到 Github 上,可以直接下载获取!