Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

这篇具有很好参考价值的文章主要介绍了Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【注意:官网教程现已完善,请您访问官网进行学习,此教程现已失效,官网版本已更新至4.0以上,感谢您的观看,官网请访问:快速上手 | HybridCLR (code-philosophy.com)】

项目是根据官网的示例工程进行修改的,版本参数如下:

unity:2020.3.30(2023.5.29日更新至wolong最新版,经测试依然有效)

wolong:v2.3.0

官网地址发生了变化更新为:HybridCLR (focus-creative-games.github.io)

相关项目示例仓库地址:wolong2.0版本测试项目: 这是一个学习wolong的测试demo,具体教程操作详见CSDN (gitee.com)

-------------------------------------------------------------

1、安装:参考:第一篇文章Unity 热更新基础HybridCLR:安装部署(HybridCLR手记二)_作孽就得先起床的博客-CSDN博客

2、引入示例工程:

请访问官方的文件仓库:github或者是gitee,这里提供的是它gitee的示例工程网址:

hybridclr_trial: HybridCLR的示例项目 (gitee.com)

下载它

完成后导入项目:

导入到你项目同工程目录下,导入内容为:(图片为下载的示例工程),箭头为导入项目

(1提示的是目录)

步骤1(共2步)

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 然后还有

步骤2(共2步)

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 这里导进去了一个流文件读取插件,为了保证稳定因为官方用的是通过这个流文件插件读取的方案,但是热更流文件目录是只读目录,为了符合规范,因此依然选择了WWW方案,后面会对他进行修改,这里先导入进去

这样示例工程就导入完成了,进入项目

再次检查这几个选项是否一致:

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 1、这里简单说下是咋回事。简单来说这是选择的热更新程序集,我们更新的就是他。

我这里写的是因为我的脚本是属于这个程序集(如图)

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 当然,您也可以自己直接建程序集来进行热更新,如果您要自己建使用上面的就好了,就是这个

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 直接拖拽上去就好了,如果手动输入的请去掉后缀

然后来到这重新安装下:

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 这俩重新走下根据平台我这里是Win64,Generate->ALL

场景选择:main

Generate->ALL:是最容易报错的阶段,官方也有文档,写的也很详尽了,一般我们只需要找个地方先出个包就好了(不管出包是否成功,这里主要是为了Generate),出包一定要选择:

不要使用代码来进行此操作 

然后:出.dll包文件

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

这时候我们点击运行就好了,示例工程就此完成

但要热更,故此需要调整一些东西来满足热更需要:

1、在工程目录中新建一个文件夹,创建一个代码,这个文件夹下的代码将是我们要热更的脚本代码(大概会是这样)

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

 (因为wolong是通过.dll文件来进行热更新的)

注:新本的dll程序所属程序集已经发生改变,本示例已经更新为:HotUpdate.dll

2、项目工程中找到代码:LoadDll

接下来要对他进行修改:里面修改后代码如下:(注释版由ChatGPT提供)

请关注下目录,并在相应的文件下创建好目录进行使用(已更新)

using HybridCLR;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

 
public class LoadDll : MonoBehaviour
{
    //记录添加的dll文件名称
   static  List<string> aotMetaAssemblyFiles = new List<string>()
    {
        "mscorlib.dll",
        "System.dll",
        "System.Core.dll",
    };
 
   private List<string> aotFiles = new List<string>();
   private List<string> aotFil= new List<string>();
 
   private Dictionary<string, WWW> _dic = new Dictionary<string, WWW>();

   private static string _path;
    void Start()
    {
        //通过www访问加载
        Loadwww();
        StartGame();
    }
 
    void Loadwww()
    {
        foreach (var aotDllName in aotMetaAssemblyFiles)
        {
            aotFiles.Add(aotDllName);
        }
        //添加额外的dll文件
        aotFiles.Add("HotUpdate.dll");
        aotFiles.Add("Main.dll");
        //循环遍历所有dll文件
        foreach (var item in aotFiles)
        {
            if (item.EndsWith(".dll"))
            {
                //添加后缀,方便热更
                string str = item + ".bytes";
                aotFil.Add(str);
            }
        }
        //将prefabs问价加入
        aotFil.Add("prefabs");
        
        //提取dll
        foreach (var item in aotFil)
        {
            string dllBytes = Application.dataPath;
            Directory.SetCurrentDirectory(Directory.GetParent(dllBytes).FullName);
            dllBytes=Directory.GetCurrentDirectory();
            _path = dllBytes+("/HotUpdate/HotDllFix/");//保存加载的目录
            dllBytes=dllBytes+("/HotUpdate/HotDllFix/" + item);
            
            //进行加载
            WWW www = new WWW("file://"+dllBytes);
            if (www.error!=null)
            {
                
            }
           //放入等待加载
            _dic.Add(item,www);
        }
        
    }
    
 
 
    void StartGame()
    {
        LoadMetadataForAOTAssemblies();
 
#if !UNITY_EDITOR
// //Assembly-CSharp.dll.bytes
        System.Reflection.Assembly.Load(_dic["HotUpdate.dll.bytes"].bytes);
#endif

        AssetBundle prefabAb = AssetBundle.LoadFromMemory(_dic["prefabs"].bytes);
        GameObject testPrefab = Instantiate(prefabAb.LoadAsset<GameObject>("Cube.prefab"));
    }
 
 
    
    
    
 
    /// <summary>
    /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
    /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
    /// </summary>
    private static void LoadMetadataForAOTAssemblies()
    {
        
        /// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
        /// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
 
        HomologousImageMode mode = HomologousImageMode.SuperSet;
        foreach (var aotDllName in aotMetaAssemblyFiles)
        {
            //根据路径进行加载
            byte[] dllBytes =
                File.ReadAllBytes(_path + aotDllName + ".bytes");
            // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
            LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
            Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
        }
    }
}

提示:我这里的代码在出更新脚本文件后需要您手动从流目录下移动一下文件到加载的指定目录下,才能够正常运行,具体请自行分析下代码

在修改完代码后请重新执行这三步操作:

Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)

热更新wolong模块结束

 这文章都没VIP或收费,给点赞、收藏和关注吧~(嘤嘤~)文章来源地址https://www.toymoban.com/news/detail-429535.html

到了这里,关于Unity 热更新基础HybridCLR:Windows平台使用(HybridCLR手记二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Unity】热更新HybridCLR学习与实战(一)

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

    2024年02月03日
    浏览(26)
  • Unity 热更新 HybridCLR 对接到项目中

    Unity版本 2021.3.6f1 HybridCLR版本 2.2.0 1.1要注意两点: 1.Unity 要安装了Windows-IL2CPP 环境的,这个Unity官网有提供,根据自己Unity版本下载对应的环境即可。 2.il2cpp需要c++的环境库,一般情况不是C开发的,很容易缺失c++的开发环境,因此在打包时会出现 error: could not set up a toolchain

    2024年02月12日
    浏览(33)
  • Unity | YooAssetV2.1.0 + HybridCLR热更新

    目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果         本文记录利用YooAsset+HybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版,dll(原生文件)和资源要建两个package分别来进行bu

    2024年02月19日
    浏览(27)
  • Unity最新热更新框架 hybridclr_addressable

    GitHub:YMoonRiver/hybridclr_addressable: 开箱即用的商业游戏框架,集成了主流的开发工具。将主流的GameFramework修改,支持Addressable和AssetBundle,已完善打包工具和流程。 (github.com) # 新增GameFramework Addressables 开箱即用 # 新增循环列表 ### UnityGameFramework   **此框架参考:**    `GameFramework

    2024年02月03日
    浏览(33)
  • Unity之如何接入HybridCLR(代号wolong,原huatuo)热更新框架

    HybridCLR(代号wolong)是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。 官方提供了完整的教程:HybridCLR快速上手 官方还提供了一个简易的小Demo,演示了如何使用HybridCLR实现热更新。hybridclr_trial 官方文档其实已经非常详细了,我写本文目的主要

    2024年02月12日
    浏览(29)
  • 【Unity3D热更新】Unity3D 零成本、高性能的C#的热更新框架:HybridCLR

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 相信只要做过热更新的小伙伴,都被热更新搞过心态吧。 我有一个小伙伴,本来是面向

    2024年01月16日
    浏览(40)
  • Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

             一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷

    2024年02月12日
    浏览(31)
  • 随手记3:C#Unity中随机数的使用

    问题: 在同时引用UnityEngine和System命名空间时【using UnityEngine(继承MonoBehaviour类+)+using System(用到了浮点数转字符串的Convert函数)】,如果直接Random.Range(float1float2)会出现“Random”是“UnityEngine.Random”和“System.Random”之间的不明确的引用的报错 解决方法: 在前面加上到底

    2023年04月24日
    浏览(34)
  • HybridCLR 热更新介绍

    @HybridClr介绍 以下讲简单阐述下个人理解的Hclr的相关知识,以及在使用中遇到的坑点. 为了方便下文的更好的理解,建议大家先简单过一下下文的一些名称和一些简单的知识点: CommonLanguageRuntime ,公共语言运行环境; Ahead Of Time (AOT) ,指运行前编译 - 静态编译环境; Just-in-t

    2024年02月16日
    浏览(22)
  • HybridCLR 热更新配置

    unity、vs hybridclr hybridclr_trial hybridclr_unity YooAsset 点击菜单 Windows/Package Manager 弹出窗口 点击左上角的加号,选择 Add package from git url... 输入上方url,点 Add 或者按 回车 键,等待加载完成。 因为网络问题无法加载的 用将 hybridclr_unity 库clone或者下载到本地,选择 Add package from di

    2024年02月10日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包