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

news2024/11/26 0:31:00

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,打开包管理器,在这里插入图片描述
填入https://gitee.com/focus-creative-games/hybridclr_unity.git或https://github.com/focus-creative-games/hybridclr_unity.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_EDITOR
        Assembly 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");
#endif
 Type 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。
重新运行程序
结果如下
在这里插入图片描述
热更成功!


总结

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

声明:本博文章若非特殊注明皆为原创原文链接
https://blog.csdn.net/Wrinkle2017/article/details/126662423
————————————————————————————————

💢💢版权声明

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

档案室漏水检测控制的类型和感应漏水线的规格

一、漏水绳的类型 漏水绳的类型有两种&#xff0c;一种是区域式漏水绳&#xff0c;搭配漏水控制器&#xff0c;对漏水异常秒级反应、报警。但是仅仅是对有漏水的情况进行监控&#xff0c;无法给出具体的位置&#xff0c;还需要工作人员的进一步排查。 还有一种是定位式漏水检…

SolVES模型在生态系统服务社会价值评估中的运用

SolVES模型&#xff08;Social Values for Ecosystem Services&#xff09;全称为生态系统服务社会价值模型&#xff0c;是由美国地质勘探局和美国科罗拉多州立大学联合开发的一款地理信息系统应用程序&#xff0c;开发该模型的目的主要是对生态系统服务功能中的社会价值进行空…

vue3前台查询使用多个字典项并且和后台交互

目录 一、前端使用 1.前台vue3接口使用 dictManege.ts 2.前台使用该接口地方 3.前台反显地方 其他几个都一样&#xff0c;这里使用在state中定义的idTypeList,在上面赋值&#xff0c;在这里使用 二、后端使用 4.后端controller接口实现 其中使用字典String[]来接收 放…

多线程环境下Java怎么从线程返回信息?

1. 问题描述 习惯了传统单线程过程式模型的程序员在转向多线程环境时&#xff0c;最难掌握的一点就是如何从线程返回信息。从结束的线程获得信息&#xff0c;这是多线程编程中最常被误解的方面之一。run()方法和start()方法不返回任何值。 2. 使用存储方法返回结果 如下面程…

自动化档案档案库房库房温湿度调节的好处

档案库房环境温湿度不合适&#xff0c;那么会造成供配电系统、网络设备不稳定&#xff0c;机房无法正常运行、资料老化。仓库温湿度不合适&#xff0c;储藏货物就会霉变、腐烂&#xff0c;给企业带来经济损失。所以环境温湿度必须实时处于可视、可控的范围&#xff0c;因此要安…

从零开始 Spring Boot 34:日志 II

从零开始 Spring Boot 34&#xff1a;日志 II 图源&#xff1a;简书 (jianshu.com) 在从零开始 Spring Boot 10&#xff1a;日志 - 红茶的个人站点 (icexmoon.cn)中&#xff0c;我简单介绍过如何在Spring Boot中整合SLF4J日志。实际上&#xff0c;如果没有特殊需求&#xff0c…

开发一套pacs系统主要解决的问题有哪些?

PACS的定义 PACS&#xff08;picture archiving and communication system&#xff09;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&…

MySQL---锁机制

1. 锁的分类 从对数据操作的粒度分 &#xff1a; 表锁&#xff1a;操作时&#xff0c;会锁定整个表。 行锁&#xff1a;操作时&#xff0c;会锁定当前操作行。 从对数据操作的类型分&#xff1a; 读锁&#xff08;共享锁&#xff09;&#xff1a;针对同一份数据&#xff…

ChatGPT与低代码开发:危机四伏、技术暴走!

随着人工智能技术和低代码开发平台的不断发展&#xff0c;越来越多的企业开始采用AI技术来提高业务效率和创造更好的用户体验。AI技术与低代码开发的结合&#xff0c;为企业节省了大量时间和成本&#xff0c;同时也提高了业务创新和竞争力。然而&#xff0c;一些潜在的问题也开…

关于怎么用好API接口获取更多信息节约时间成本

API接口是现代互联网应用开发的重要工具&#xff0c;它允许开发者使用标准化的方式获取数据和服务&#xff0c;在搭建应用中扮演了重要的角色。因此&#xff0c;如何利用API接口获取更多信息已经成为了每个开发者需要掌握的技能之一。 第一步&#xff1a;寻找 API接口 在开始…

2023Revit精装模块,一键搞定便捷精装!

大家好&#xff0c;这里是BIM建模助手。 今天有个重磅消息要告诉大家&#xff0c;那就是BIM建模助手的【精装模块】上线啦&#xff01; 为了辅助BIMer快速设计出精装修的房屋效果&#xff0c;我们开发了【精装模块】&#xff0c;无论是装饰面层、铺排瓷砖、布置吊顶、统计出量…

​​​​​​​博物馆文物馆藏环境空气质量无线监控系统方案

博物馆文物馆藏环境空气质量无线监控系统方案 博物馆无线环境测控系统 博物馆恒温恒湿消毒净化系统 现代化博物馆空气质量一体化3D可视化管控平台 博物馆温湿度在线监控系统 博物馆光照在线监控系统 博物馆二氧化碳在线监控系统 博物馆在线监控系统 博物馆紫外线在线监控…

【TikZ 简单学习(下):基础绘制】Latex下的绘图宏包

【TikZ 简单学习[下]&#xff1a;基础绘制】Latex下的绘图宏包 上文绘制多个节点给节点添加统一样式给节点命名使用相对位置绘制给节点标签链接边的绘制在线边上添加标签绘制蛇形线和多行文本层图绘制一个简单的树 上文 【TikZ 简单学习(上)&#xff1a;基础绘制】Latex下的绘…

【笔试强训选择题】Day19.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

深度学习神经网络学习笔记-多模态方向-11-Deep Voice: Real-time Neural Text-to-Speech

摘要 本文提出Deep Voice&#xff0c;一种完全由深度神经网络构建的生产质量文本到语音系统。Deep Voice为真正的端到端神经语音合成奠定了基础。该系统由五个主要的构建模块组成:用于定位音素边界的分割模型、字素到音素的转换模型、音素时长预测模型、基频预测模型和音频合成…

那年我手执『wait』桃木剑,轻松解决僵尸进程~

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;进程退出&#x1f426;进程常见的退出方法&#x1f414;正常终止&#x1f514;return 退出&#x1f514;exit 退出&#x1f514;_exit 退出 &#x1f414;异常终止 &#x1f427;进程等待&#x1f426;必要性…

00后实在太卷了,跳槽到我们公司起薪20k,都快超过我了....

都说00后已经躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 前段时间我们部门就来了个00后&#xff0c;工作都还没两年&#xff0c;跳到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。最近和…

美股股指期货是什么?有哪些美股股指期货交易门槛?

美股期指就是美股期货指数&#xff0c;并不是单独的指道琼斯还是纳斯达克&#xff0c;就好像中国的股指期货一样道理&#xff0c;是以沪深300为标的的&#xff0c;美股期指也是期货&#xff0c;不是单纯的指数。交易美股产品需要先完成开户&#xff0c;要想一次性开户成功就要满…

2023.4月及5月最新HCIP 考试战报来袭

2023年HCIP/CCNP考试战报_微思xmws的博客-CSDN博客国内企业或国企、事业单位&#xff0c;华为设备普及&#xff0c;国内未来发展趋势&#xff0c;考华为认证更被认可。如果你在外企上班或有出国打算&#xff0c;推荐考思科。https://blog.csdn.net/XMWS_IT/article/details/129…

【隔空投送】2023新品,加速科技ST2500E重磅来袭

随着5G通信、人工智能、虚拟现实、新能源以及先进封装技术的飞速发展&#xff0c;芯片线宽尺寸不断减小&#xff0c;芯片复杂度不断跃升&#xff0c;对测试机的要求愈加提高。提供多种测试程序并可进行大量的并行测试&#xff0c;有效减少测试成本&#xff0c;缩短产品上市时间…