Unity + HybridCLR,近乎完美的新热更方案,从零开始(一)——Hello World

编程入门 行业动态 更新时间:2024-10-09 15:24:03

Unity + HybridCLR,近乎完美的新热更方案,<a href=https://www.elefans.com/category/jswz/34/1769682.html style=从零开始(一)——Hello World"/>

Unity + HybridCLR,近乎完美的新热更方案,从零开始(一)——Hello World

Unity + HybridCLR,近乎完美的新热更方案,从零开始(一)——Hello World

  • 前言
  • 一、HybridCLR是什么?
  • 二、使用步骤
    • 环境配置
    • 创建项目
    • 创建 HotUpdate 热更新模块
    • 安装和配置HybridCLR
    • 配置HybridCLR
    • 创建热更脚本
    • 加载热更新程序集
    • 测试热更新
  • 总结
  • 💢💢版权声明


前言

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


一、HybridCLR是什么?

HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成AOT+Interpreter 混合runtime,进而原生支持动态加载assembly,使得基于il2cpp backend打包的游戏不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以AOT+interpreter混合模式执行,从底层彻底支持了热更新。

HybridCLR不仅支持传统的全解释执行模式,还开创性地实现了 Differential Hybrid Execution(DHE) 差分混合执行技术。即可以对AOT dll任意增删改,会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。

我自己理解的就是:一种基于C#的热更技术,完美支持C#原生,不需要写额外的适配器啥的,直接就能用,就是把il2cpp改了下。

二、使用步骤

环境配置

unity安装的时候一定要安装IL2cpp部分,Windows Build Support(IL2CPP)或Mac Build Support(IL2CPP)。
现在支持的unity 版本:2019.4.40、2020.3.26+、2021.3.0+

我用的unity 版本是2021.3.23


Windows
Win下需要安装visual studio 2019或更高版本。安装时至少要包含 使用Unity的游戏开发 和 使用c++的游戏开发 组件。
安装git
Mac
要求MacOS版本 >= 12,xcode版本 >= 13,例如xcode 13.4.1, macos 12.4。
安装 git
安装cmake

创建项目

创建ConsoleToScreen脚本,方便在屏幕上看日志。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConsoleToScreen : MonoBehaviour
{const int maxLines = 50;const int maxLineLength = 120;private string _logStr = "";private readonly List<string> _lines = new List<string>();public int fontSize = 15;void OnEnable() { Application.logMessageReceived += Log; }void OnDisable() { Application.logMessageReceived -= Log; }public void Log(string logString, string stackTrace, LogType type){foreach (var line in logString.Split('\n')){if (line.Length <= maxLineLength){_lines.Add(line);continue;}var lineCount = line.Length / maxLineLength + 1;for (int i = 0; i < lineCount; i++){if ((i + 1) * maxLineLength <= line.Length){_lines.Add(line.Substring(i * maxLineLength, maxLineLength));}else{_lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength));}}}if (_lines.Count > maxLines){_lines.RemoveRange(0, _lines.Count - maxLines);}_logStr = string.Join("\n", _lines);}void OnGUI(){GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity,new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f));GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle() { fontSize = Math.Max(10, fontSize) });}
}

把这个脚本挂载到空场景的空物体上,在Build Settings中添加这个场景到打包场景列表

创建 HotUpdate 热更新模块

创建 Assets/HotUpdate 目录
在目录下 右键 Create/Assembly Definition,创建一个名为HotUpdate的程序集模块

安装和配置HybridCLR

Windows——>Package Manager,打开包管理器,
填入.git或.git
安装包成功后,打开HybridCLR——>Installer

配置HybridCLR

PlayerSettings的配置

创建热更脚本

Assets/HotUpdate/Hello.cs
这个脚本内容是需要热更的,代码如下:

using System.Collections;
using UnityEngine;public class Hello
{public static void Run(){Debug.Log("Hello, HybridCLR");}
}

加载热更新程序集

创建Assets/LoadDll.cs脚本,然后在main场景中创建一个GameObject对象,挂载LoadDll脚本。

using HybridCLR;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;public class LoadDll : MonoBehaviour
{void Start(){// Editor环境下,HotUpdate.dll.bytes已经被自动加载,不需要加载,重复加载反而会出问题。
#if !UNITY_EDITORAssembly hotUpdateAss = Assembly.Load(File.ReadAllBytes($"{Application.streamingAssetsPath}/HotUpdate.dll.bytes"));
#else// Editor下无需加载,直接查找获得HotUpdate程序集Assembly hotUpdateAss = System.AppDomain.CurrentDomain.GetAssemblies().First(a => a.GetName().Name == "HotUpdate");
#endifType type = hotUpdateAss.GetType("Hello");type.GetMethod("Run").Invoke(null, null);}
}

运行菜单 HybridCLR/Generate/All 进行必要的生成操作
这是用来生成要热更的脚本的dll文件的
将{proj}/HybridCLRData/HotUpdateDlls/StandaloneWindows64(MacOS下为StandaloneMacXxx)目录下的HotUpdate.dll复制到Assets/StreamingAssets/HotUpdate.dll.bytes,注意,要加.bytes后缀!!
然后就可以打包了,运行之后的结果是这样的

测试热更新

修改Assets/HotUpdate/Hello.cs的Run函数中Debug.Log(“Hello, HybridCLR”);代码,改成Debug.Log(“Hello, World”);。
运行菜单命令HybridCLR/CompileDll/ActiveBulidTarget重新编译热更新代码。
将{proj}/HybridCLRData/HotUpdateDlls/StandaloneWindows64(MacOS下为StandaloneMacXxx)目录下的HotUpdate.dll复制为刚才的打包输出目录的 XXX_Data/StreamingAssets/HotUpdate.dll.bytes。
重新运行程序
结果如下

热更成功!


总结

欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。
如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~

声明:本博文章若非特殊注明皆为原创原文链接

————————————————————————————————

💢💢版权声明

版权声明:本博客为非营利性个人原创
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本博主进行联系
对于经本博主明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明

更多推荐

Unity + HybridCLR,近乎完美的新热更方案,从零开始(一)——Hello World

本文发布于:2024-03-07 23:48:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1719267.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:从零开始   完美   方案   Unity   HybridCLR

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!