在Unity2022.3.7中集成ET 7.2 + HybridCLR 0.10.4 + XAsset 2022.2 + EUI 实现ECS编码,C#代码热更,资源热更,UI管理系统的基础框架

工具介绍

ET 7.2 

        ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等

 HybridCLR

        HybridCLR是一个特性完整、零成本、高性能、低内存近乎完美的Unity全平台原生c#热更方案。

XAsset 2022.2

        xasset 是专业的Unity资源系统。

        xasset 提供开箱即用的打包、分包、加密、边玩边下和跨平台加载等技术让Unity项目的开发更快更轻松!

  ET-EUI  (在文章发布时,ET-GUI作者已匹配到ET-7.0,文章中将以此为基础修改匹配到ET-7.2)

       ​​​​ ET-EUI是基于ET框架的简单UI模块

搭建流程

  • ET
  1.  从github上下载ET 7.2 版本 ,用Unity打开工程中名字为Unity的项目目录。
    操作步骤可以参考 ET6.0框架-开发环境搭建,以及Book目录下的最新 运行指南.md 。
     
  2. 切换到Anroid平台

     
  3. 修改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))

     
  4. 运行工程前,需要执行"BuildModelAndHotfix"命令来编译代码及启动内置服务器(选择ClientServer模式);如果需要单独运行服务器,选择Client模式,再参考文档 运行指南.md 中的说明单独启动服务器。
      
     
  5. 编译成功后,就可以正常启动了。

     
  •  HybridCLR
  1.  在安装好ET后,再按照官方的教程 安装HybridCLR | Focus Creative ,来添加HybridCLR package,然后再进行安装:

      
  2. 下载官方的 HybridCLR 示例项目 工程,把Assets目录里的所有文件拷贝到ET工程里Unity的Assets目录里,然后打开其中的main场景。

  3. 在启动演示场景前,需分别执行以下命令操作;

        

    执行完毕后,正常是会在StreamingAssets目录生成以下文件:


    如果没有生成以上全部文件或者遇到需要先打包的提示,则需要打包一次apk后再重新执行命令操作。最后生成上图的文件列表后,就能正常启动了。
  • XAsset 2022.2 免费版

    XAsset 的安装简单,直接导入安装package就可以了, 详情可浏览 官方文档,这里简单说一下需要注意的使用事项:
  1.  2022.2版本较2022.1版本做了很多改动,首先从打包导出的版本控制文件上,从原来的两个文件(manifest.json, versions_v?.json)增加到2+n个文件(updateinfo.json,versions_v?.json,[资源分类文件.json,...] ),且资源分类文件是通过配置生成的,省去了为资源自定义assetbundle名字的操作。

     
     
  2. 2022.2版本中已将文件断点续传功能从原生C#代码改成通过UnityWebRequest来实现。

         

        在实现的下载逻辑中涉及两次请求:一次是获取文件的大小等信息,一次是下载文件的内容。当通过CDN下载如json等格式的文本配置文件时,如果在CDN上是使用对象存储方式存放这类文件时,在通过UnityWebRequest请求获取文件的大小信息时,有可能获得的不是正确的大小数值,可通过HttpWebRequest的方式获取正确文件信息:

        

  •  ET-EUI
  1. 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等)
     
  2. 直接拷贝完毕后,由于ET7.2框架的目录结构更新,会出现一些重复的文件,需要检查差异并整合,删除不需要的同名文件。
     
  3. 另外ET7.2框架有一些属性定义类的名字也发生了改变,比如FriendClassArrbite 改为 FriendOfAttribute, ChildTypeAttribute改为ChildOfAttribute等,相应的也需要同步更新EUI的UICodeSpawner代码中自动生成UI类的定义逻辑。

        

 ET 通过 HybridCLR  生成并加载 热更代码

  1. 添加ET 宏定义 ENABLE_CODES

     
  2. 将ET热更模块的平台属性 改成 全平台

     
  3. 在HybridCLR Settings中添加需要热更的Assembly Definitions
      
  4. 参照HybridCLR的 BuildAndCopyABAOTHotUpdateDlls命令实现一个新的BuildETAssetsAndCopyToStreamingAssets命令

      
     
  5. 执行ET的BuildPackage命令打包资源,资源会存放StreamingAssets目录下

      
  6. 再依次执行HybridCLR的三个命令生成热更代码,执行成功后,生成的文件也存放在StreamingAssets目录下

             
     
  7. 参考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();
    		}
  8. 生成Apk包,在手机或模拟器启动程序测试热更(启动后日志显示了一个错误,原因是把服务器的代码也添加到热更代码里了,后续只需要将Hotfix和Model的Server代码定义在新的Assembly里就可以了)
     

                   

 整个工程代码和涉及HybridCLR需要修改的UnityEditor.CoreModule.dll文件(放在工程的Tools目录里)都放到 Github 上,可以直接下载获取!

猜你喜欢

转载自blog.csdn.net/veimen/article/details/127789745