【Unity实战】HybridCLR热更快速集成

这篇具有很好参考价值的文章主要介绍了【Unity实战】HybridCLR热更快速集成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文假设你已经通过UPM导入了HybridCLR、Addressables、il2cpp支持并具有一定的C#基础和Unity编辑器操作能力。

热更程序集

由于本文主打快速集成,故将Assembly-CSharp划入到热更新DLL。理论上成熟的项目应该用Assembly Definition进行精细划分以便于管理和缩短编译时间。但是若掌握不好,划分不明白,可能会出现交叉引用导致反射机制原地GG。

有关Assembly Definition,请见官方文档。

Unity - Manual: Assembly definitions

打开Project Settings, 找到Hybrid Settings,手动将Assembly-CSharp添加到热更新DLL范围内。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

如果你有Assembly Definition,也请添加到红框上方的属性中。请注意,热更新Assembly Definition和热更新dlls属于“并且”关系,不能存在相同项。

比如你把Assembly Definition的名写到了底下热更新dlls里头了,然后上面热更新Assembly Definition那里你还把你刚才手动填名字的Assembly Definition给拖进去了。

另起一个热更入口程序集和场景

由于Assembly-CSharp为热更新DLL,那么客户端拉取热更资源的逻辑就不能放在Assembly-CSharp,否则反射机制不起作用,还带来报错。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

在这个程序集的同级目录或者子级目录起一个热更入口脚本,具体怎么拉Addressables更新这里就省略了,加载热更DLL的逻辑可参考如下:

    /// <summary>
	/// 加载热更的DLL
	/// </summary>
	IEnumerator LoadHotfixDLLs()
	{
#if !UNITY_EDITOR
        // 读取的热更dll
        var hotFixDllLabelHandle = Addressables.LoadAssetsAsync<TextAsset>("HotUpdateDLL", null);
        yield return hotFixDllLabelHandle;
        var hotFixDlls = hotFixDllLabelHandle.Result;
        Addressables.Release(hotFixDllLabelHandle);
        // 加载获得的dll
        foreach (var hotFixDll in hotFixDlls) {
            Assembly.Load(hotFixDll.bytes);
        }
        Debug.Log("[HotUpdater] LoadHotfixDLLs complete!");
#endif
		yield return null;
	}
	/// <summary>
	/// 加载aot的DLL
	/// </summary>
	/// <returns></returns>
	IEnumerator LoadMetadataForAOTDLLs()
	{
#if !UNITY_EDITOR
		HomologousImageMode mode = HomologousImageMode.SuperSet;
        var aotMetadateDllHandle = Addressables.LoadAssetsAsync<TextAsset>("AOTMetadataDLL", null);
        yield return aotMetadateDllHandle;
        var AOTMetadataDlls = aotMetadateDllHandle.Result;
        foreach (var AOTMetadataDll in AOTMetadataDlls)
        {
            LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(AOTMetadataDll.bytes, mode);
            Debug.Log($"[HotUpdater] LoadMetadataForAOTAssembly:{AOTMetadataDll.name}. mode:{mode} ret:{err}");
        }
        Addressables.Release(aotMetadateDllHandle);
		Debug.Log("[HotUpdater] LoadMetadataForAOTDLLs complete!");
#endif
		yield return null;
	}

	IEnumerator EnterGame()
	{
		yield return LoadMetadataForAOTDLLs();
		yield return LoadHotfixDLLs();
		Addressables.LoadSceneAsync("MainMenu").Completed += (obj) =>
		{
			if (obj.Status == AsyncOperationStatus.Succeeded)
			{
				Debug.Log("[HotUpdater] Successfully load into MainMenu.");
			}
			else
			{
				Debug.LogError("[HotUpdater] Failed to load MainMenu scene!");
			}
		};
	}

简而言之就是加载完热更DLL后和AOT元数据DLL后再进入你游戏的主场景(或者说有引用Assembly-CSharp代码的东西)。

这里笔者假定你的热更新DLL以及元数据DLL在Addressables里各自有标签,于是全拉出来进行Assembly.Load。

你可能会注意到宏,编辑器环境下测试是不能读取热更DLL的,因为属于同一个程序集加载了两遍,浪费不说还带来问题。

编译热更新DLL和AOT元数据DLL

元数据DLL是个新词,也是HybridCLR的牛逼之处。用大白话讲,那些你引用的System命名空间、Newtonsoft.Json等等这些不需要热更新的库都算作AOT元数据DLL。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

单击All进行热更新DLL编译。

编译完成后,你的工程文件夹下会有热更新DLL和元数据,你可以在Assets文件夹下另起一个存热更DLL的文件夹,并将图中文件夹里的内容拷贝进去。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

有关元数据DLL,不是所有的dll都需要拷贝,你可以看一下你工程里有一个叫AOTGenericReferences,那里有一个表。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

但是别回到Unity Editor刷新,Unity会当成程序集导入,你需要改一下后缀名。

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

将DLL加到Addressables

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

你可以用Label标签进行区分,案例中用的代码是用label进行区分和加载。

Addressables系统设置

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

勾选Build Remote Catalog,配置Build和Load路径为Remote

Build Settings设置

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

理论上你只需要把热更入口场景打进去就行,其他都不要。

允许通过HTTP下载(可选)

【Unity实战】HybridCLR热更快速集成,unity,unity,游戏引擎

如果你测试环境用的网页服务器没有配置HTTPS,那么你需要把这个改成allowed,否则Addressables下载流程可能不会走。

然后走打包流程即可,现在你可以用打包出来的客户端进行测试了。祝好运!文章来源地址https://www.toymoban.com/news/detail-773424.html

到了这里,关于【Unity实战】HybridCLR热更快速集成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity划时代热更方案 YooAsset+HybridCLR(wolong)(原huatuo)(四)

    上一篇简介了YooAsset的安装,本篇我们来详细了解一下Asset的功能和使用。 之前的安装的示例项目 Space Shooter 在 Assets/Samples/Space Shooter 下。 通过右键创建配置文件(Project窗体内右键 - Create - YooAsset - Create YooAsset Setting) 注意:请将配置文件放在Resources文件夹下 配置说明:Ma

    2024年02月05日
    浏览(49)
  • Unity + HybridCLR,近乎完美的新热更方案,从零开始(一)——Hello World

    最近又新接触了一种unity热更的解决方案——HybridCLR,自称是: 特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案 。 接下来我们就来一起学习下。 下面是官方文档的链接,一切以官方为主:HybridCLR HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成

    2024年02月07日
    浏览(46)
  • Unity划时代热更方案 YooAsset+HybridCLR(wolong)(原huatuo)(六)完结篇

    开始重头戏了,我们都知道wolong是用来热更代码部分,YooAsset是热更资源部分,所以二者结合起来可以就是热更完美的解决方案。 下载wolong示例项目 用 git clone或者直接下载。 用unity打开此项目,发现这个项目菜单栏已经有HybridCLR选项了,点击该选项下方的installer…,安装。

    2024年02月06日
    浏览(49)
  • C语言与游戏引擎插件开发:Unity、Unreal Engine中C插件的编写与集成(一)

    目录 一、引言 C语言在游戏开发中的重要地位与优势 游戏引擎插件机制与C语言的价值 二、C语言基础与游戏开发特性 C语言核心特性及其在游戏开发中的应用 游戏引擎API对接关键概念与技巧 C语言在游戏开发领域占据着无可替代的重要地位,尤其在应对高性能计算需求与底层

    2024年04月29日
    浏览(72)
  • C语言与游戏引擎插件开发:Unity、Unreal Engine中C插件的编写与集成(四)

    目录 一、C插件开发最佳实践与常见问题解析 性能优化: 跨平台兼容性: 版本管理与升级: 二、结论 C语言在游戏引擎插件开发中的关键作用与优势: 对开发者提出建议: 性能优化: 内存管理: 智能指针 :利用UE的 TSharedPtr 、 TWeakPtr 等智能指针管理动态内存,确保资源释

    2024年04月27日
    浏览(55)
  • Unity转微信小游戏 HybridCLR + YooAsset 实践

    参考链接:https://github.com/wechat-miniprogram/minigame-unity-webgl-transform?tab=readme-ov-file Unity 2021.3.15f1c1 Unity 2021.2.5f1c302 wxSDK HybridCLR 5.0.0 YooAsset 1.5.7 后台配置白名单 微信小游戏注意事项: 不支持同步加载。 不支持资源加密。 不支持多Package 关闭WebGL本地缓存 参考地址 因为微信小游戏

    2024年04月12日
    浏览(110)
  • 【Unity】热更新HybridCLR学习与实战(一)

    从事unity开发以来一直未真正系统的学习过热更新,现在业务上有需要,借此机会来深入学习一下,调研了几种现有比较火的热更新框架,对比了一下优劣,最终决定使用HybridCLR来做热更新,最终目的是要加入到我们已有的项目中,所以肯定要全面实现商业化,因此有同等需

    2024年02月03日
    浏览(42)
  • [游戏开发][Unity]Assetbundle下载篇(1)热更前准备与下载AB包清单

    打包与资源加载框架目录 热更流程都不是固定的,每个人写的状态机也有所差别,但是一些必要步骤肯定不可能少,例如下载清单,对比版本,下载AB包,标记下载完成。我接下来的每一篇文章都是下载AB包的重要步骤,大概率是不能省略的。 检查沙盒路径是否存在 检查下载

    2024年02月15日
    浏览(40)
  • 【Unity实战篇 】| 2.5D游戏是如何做出来的呢,2.5D游戏快速制作教程

    前言 玩过游戏的朋友都知道,市面上最常见的游戏多数分为2D和3D两种。 2D和3D游戏之间的差异大家都知道,一个是类似纸片游戏属于二维层面,另一个则是在3D立体空间中游玩。 其中还夹杂着一个 2.5D游戏 ,本篇文章就来讲一下怎么通过Unity进行2.5D游戏是怎样的以及如何制作

    2024年02月12日
    浏览(102)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包