Unity | YooAssetV2.1.0 + HybridCLR热更新

本文介绍了如何在Unity项目中使用YooAsset进行资源和DLL的更新,包括资源配置、打包、上传到CDN服务器,以及修改代码以通过YooAsset加载和运行。重点讲述了从StreamingAssets切换到YooAsset的步骤和相关配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、项目更改

二、使用YooAsset热更

1.资源配置

2.资源构建

3.将两个文件夹下的资源上传CDN服务器

4.修改代码

5.运行效果

三、附个Demo


        本文记录利用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加载dll
        foreach (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");
#endif
        Debug.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";
            };
        };
    }

5.运行效果

三、附个Demo

        有钱的捧个场,也可直接私信要Demo:YooAssetV2.1.0+HybridCLR热更新资源-优快云文库

### 关于 Unity HybridCLR 热更新的教程 #### 准备环境 为了使项目能够支持 HybridCLR热更新功能,需先安装并配置 HybridCLR 插件。这一步骤可以通过访问菜单栏中的 `Project Setting` 并选择 `HybridCLR Settings` 来完成,在此界面内向 `Hot Update Assemblies` 添加必要的 HotUpdate 程序集[^2]。 #### 安装插件 通过点击顶部菜单里的 `HybridCLR/Installer…` 可启动 HybridCLR 的安装流程;按照提示操作直至安装过程结束即可成功引入该组件至开发环境中[^4]。 #### 工具库导入 对于辅助工具的支持同样重要,下载官方提供的示例包 `hybridclr_trial` 后,应将其中两个特定文件夹——即 `com.gwiazdorrr.betterstreamingassets` 和 `Unity-Logs-Viewer` ——放置到当前工程目录下的 `Packages` 文件夹里以增强项目的调试与资源管理能力。 #### 版本控制与DLL加载 实现热更新的核心在于如何有效地管理和应用不同版本间的差异。为此,开发者通常会维护一份版本配置表用于记录最新的二进制模块信息,并据此决定是否需要从远程服务器获取新的 DLL 文件来进行替换或补充现有逻辑[^1]。 ```csharp // 假设有一个函数负责检查是否有可用的新版DLL public void CheckForUpdates() { string localVersion = GetLocalAssemblyVersion(); // 获取本地版本号 string remoteVersion = FetchRemoteAssemblyVersion(); // 请求远端版本号 if (localVersion != remoteVersion) { DownloadAndLoadNewDlls(remoteVersion); // 如果发现有新版本,则执行下载和加载动作 } } ``` 上述代码片段展示了基本思路:定期查询服务端是否存在更高级别的程序集版本,一旦确认存在则触发相应的处理机制来确保客户端始终处于最新状态。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值