目录
一、项目更改
二、使用YooAsset热更
1.资源配置
2.资源构建
3.将两个文件夹下的资源上传CDN服务器
4.修改代码
5.运行效果
本文记录利用YooAsset+HybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版,dll(原生文件)和资源要建两个package分别来进行build。dll package采用RawFileBuildPipeline,资源采用BuildinBuildPipeline。
本文将文章中的Demo以StreamingAsset目录加载AB包和dll改为使用YooAsset打包资源,从host来下载。
一、项目更改
- 新创建一个文件夹YooAsset,将prefabs文件夹移入该文件夹下;新建dlls文件夹。
- 修改BuildAssetsCommand.cs脚本,注释掉BuildAssetBundleByTarget(target);语句。
[MenuItem("Build/BuildAssetsAndCopyToStreamingAssets")]public static void BuildAndCopyABAOTHotUpdateDlls(){BuildTarget target = EditorUserBuildSettings.activeBuildTarget;//BuildAssetBundleByTarget(target);CompileDllCommand.CompileDll(target);CopyABAOTHotUpdateDlls(target);AssetDatabase.Refresh();}
- 运行Build/BuildAssetsAndCopyToStreamingAssets,将StreamingAssets中的四个dll移到YooAsset/dlls文件夹下。
二、使用YooAsset热更
导入YooAsset可参考这篇文章 。创建YooAssetSettings和AssetBundleCollectorSetting。
YooAssetV2.0:
原生文件目前需要走自己的构建管线流程!如果从1.0升级需要将原生文件单独拆分出来放到独立的package里,然后通过原生文件构建管线去打包。
1.资源配置
我们将默认DefaultPackage用来打包dll等原生文件,需要用PackRawFile规则进行打包。
新建一个Package,取名ResourcePackage,用来打包Prefabs等资源文件:
2.资源构建
构建DefaultPackage:
构建ResourcePackage:
3.将两个文件夹下的资源上传CDN服务器
4.修改代码
(1)参考这篇文章 中的TestLoad,先下载ResourePackage中的资源Cube,再下载DefaultPackage下的四个dll。(记得host url修改为CDN服务器地址)
(2)利用package.LoadRawFileAsync来加载DefaultPackage下的dll原生文件。
{var package = YooAssets.GetPackage("DefaultPackage");var assets = new List<string>{"HotUpdate.dll",}.Concat(AOTMetaAssemblyFiles);//通过YooAsset加载dllforeach (var asset in AOTMetaAssemblyFiles){Debug.Log($"start download asset:{asset}");RawFileHandle handle = package.LoadRawFileAsync(asset);yield return handle;byte[] bytes = handle.GetRawFileData();s_assetDatas[asset] = bytes;}Debug.Log("DownLoadAssets");}
(3)利用package.LoadAssetAsync加载ResourcePackage下的Cube prefab。
void StartGame(){Debug.Log("StartGame");LoadMetadataForAOTAssemblies();
#if !UNITY_EDITOR_hotUpdateAss = Assembly.Load(ReadBytesFromStreamingAssets("HotUpdate.dll.bytes"));
#else_hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endifDebug.Log("加载...");//Run_InstantiateComponentByAsset();GetYooAssetPrefab();Type entryType = _hotUpdateAss.GetType("Entry");entryType.GetMethod("Start").Invoke(null, null);}private static void GetYooAssetPrefab(){var package = YooAssets.GetPackage("ResourcePackage");var handle = package.LoadAssetAsync<GameObject>("Cube");handle.Completed += (op) =>{var temp= op.InstantiateAsync();temp.Completed += (op) =>{temp.Result.transform.name = "YooAssetCube";};};}