unity热更新新方案,ILRuntime

Posted Hunter_2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity热更新新方案,ILRuntime相关的知识,希望对你有一定的参考价值。

ILRuntime 是一个独立的、跨平台的 .NET Runtime,可用于在 Unity 中实现热更功能。使用 ILRuntime,您可以在游戏运行时加载和执行 C# 脚本,而不需要重新编译整个项目。

以下是一些使用 ILRuntime 的基本步骤:

在 Unity Asset Store 中下载 ILRuntime 插件,并将其导入到 Unity 项目中。

使用 Unity 中的 ILRuntime 菜单生成一个适配器程序集,该适配器程序集包含了 Unity 引擎中的所有 C# 类型,并将其注册到 ILRuntime 中。

编写一个启动脚本,用于加载和执行 C# 脚本。在该脚本中,您需要完成以下任务:

加载所有需要热更的程序集。
创建一个 ILRuntime 的 AppDomain 实例,用于加载和执行 C# 脚本。
将适配器程序集注册到 ILRuntime 的 AppDomain 中。
加载并执行第一个 C# 入口脚本。
编写需要热更的 C# 脚本,并将它们打包为一个独立的 DLL 程序集。

将 DLL 程序集上传到服务器,并在游戏运行时从服务器下载并加载这些 DLL 程序集。

在需要执行热更脚本的地方调用 ILRuntime 的 Invoke 方法,并传递需要执行的方法名和参数列表。

在使用 ILRuntime 时,需要注意以下几点:

不支持所有 .NET 类型和功能。某些特定的类型和功能可能需要特殊处理或不支持。
使用 ILRuntime 的热更功能会带来一些性能损失,因为需要额外的反射和动态编译操作。因此,需要根据具体情况权衡利弊并进行适当的优化。
使用 ILRuntime 需要一定的技术储备,需要对 C#、IL、反射等方面有一定的了解。
ILRuntime 的官方文档中有更详细的教程和示例,您可以参考它们来学习如何在 Unity 中使用 ILRuntime。

以下是一个使用 ILRuntime 实现热更功能的示例:

首先,在 Unity 中安装 ILRuntime 插件,并创建一个名为 HotFix 的空场景。

创建一个名为 HotFixManager 的 C# 脚本,并将其挂载到场景中的一个空 GameObject 上。在该脚本中,您需要完成以下任务:


using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using ILRuntime.Runtime.Enviorment;
using ILRuntime.Runtime.Generated;

public class HotFixManager : MonoBehaviour

    // ILRuntime AppDomain 实例
    private ILRuntime.Runtime.Enviorment.AppDomain _appDomain;

    // 热更 DLL 文件路径
    private string _dllPath = Application.persistentDataPath + "/HotFix.dll";

    void Start()
    
        // 初始化 ILRuntime AppDomain 实例
        _appDomain = new ILRuntime.Runtime.Enviorment.AppDomain();

        // 注册适配器程序集
        _appDomain.RegisterCrossBindingAdaptor(new MonoBehaviourAdapter());

        // 加载热更 DLL 文件
        byte[] dllBytes = File.ReadAllBytes(_dllPath);
        MemoryStream dllStream = new MemoryStream(dllBytes);
        _appDomain.LoadAssembly(dllStream, null, new Mono.Cecil.Pdb.PdbReaderProvider());

        // 执行热更代码
        _appDomain.Invoke("HotFix.Test", "Run", null, null);
    

    void OnDestroy()
    
        // 释放 ILRuntime AppDomain 实例
        _appDomain = null;
    

在上面的代码中,我们首先创建了一个 ILRuntime AppDomain 实例,并注册了一个 MonoBehaviourAdapter 适配器程序集,用于将 Unity 引擎中的 MonoBehaviour 类型注册到 ILRuntime 中。然后,我们加载了热更 DLL 文件,并执行了其中的 Test.Run 方法。

创建一个名为 Test 的 C# 脚本,并将其打包为一个独立的 DLL 程序集。在该脚本中,您需要编写需要热更的代码。以下是一个简单的示例:


using System;
using UnityEngine;

namespace HotFix

    public class Test
    
        public static void Run()
        
            Debug.Log("Hello, ILRuntime!");
        
    

在 Unity 编辑器中,将 Test 脚本打包为一个独立的 DLL 程序集,并将其放在 HotFix 资源文件夹中。

在 Unity 编辑器中,选择 Build Settings,将平台选择为 androidios,并点击 Player Settings,进入 Other Settings 面板。在该面板中,将 Scripting Runtime Version 设置为 .NET 4.x Equivalent,并将 Api Compatibility Level 设置为 .NET Standard 2.0。

构建项目并在移动设备上运行。在运行时,Unity 将从磁盘上的 HotFix.dll 文件加载并执行其中的 Test.Run 方法,从而实现热更功能。

以上代码仅供参考,实际使用中需要根据具体情

unity-ilruntime热更新


title: unity-ilruntime热更新
categories: Unity3d
tags: [unity, ilruntime, 热更新]
date: 2022-07-10 12:22:04
comments: false
mathjax: true
toc: true

unity-ilruntime热更新


前篇

  • 官网

    • github - https://github.com/Ourpalm/ILRuntime

    • 中文官网 - https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html

    • demo - https://github.com/Ourpalm/ILRuntimeU3D/

  • Unity 接入 ILRuntime 热更方案 - https://www.jianshu.com/p/e7283e1ed86a

  • Unity ILRuntime热更框架保姆级教程(一) - https://zhuanlan.zhihu.com/p/495487812

  • 临上线项目使用ILRuntime热更 - https://blog.51cto.com/zhaoqingqing/3146140

  • ILRuntime来实现热更新的优与劣 - http://ourpalm.github.io/ILRuntime/public/v1/guide/tutorial.html

  • 关于热更新,大家现在都是怎么实现的? - https://answer.uwa4d.com/question/5a9fc420d35eb22c10a0a365

  • ILRuntime:用寄存器模式吊打Lua - https://zhuanlan.zhihu.com/p/538437458


从 0 运行 helloworld

这里使用的 unity 版本为 2019.4.38f1

主要参考: Unity ILRuntime热更框架保姆级教程(一) - https://zhuanlan.zhihu.com/p/495487812

前置条件

  1. 安装 .net4.6.x 的开发包

    地址: https://dotnet.microsoft.com/en-us/download/visual-studio-sdks,

  2. 安装 rider 编辑器

    用于编辑 热更工程 代码


步骤

  1. 创建一个新工程 TestILRuntime

    edit -> project settings -> player, 修改 .net 版本为 4.x, 勾选上 allow unsafe code

  2. git 拉取 https://github.com/Ourpalm/ILRuntimeU3D/ 项目, 并将 Assets 目录下的 ILRuntime,Plugins,Samples,StreamingAssets 这几个目录拷贝到新工程的 Assets

  3. 使用 rider 打开热更工程修改打码测试

    1. 热更工程目录 Assets\\Samples\\ILRuntime\\2.0.2\\Demo\\HotFix_Project~ (unity 编辑器忽略了 ~ 结尾的文件夹)

      • 可能会遇到 .net 对应版本没安装的情况

        右键 模块 -> properties -> application -> target framework, 选择已有的版本即可 (最好安装上工程要求的版本 .net 4.6.x)

  4. 修改代码测试一下

    1. Assets/Samples/ILRuntime/2.0.2/Demo/_Scenes/Examples/01_HelloWorld.unity 场景为例, 里面就挂了一个 01_HelloWorld/HelloWorld.cs 测试脚本, 里面加载了 Assets/StreamingAssets/HotFix_Project.dll 文件, 也就是 热更工程 HotFix_Project~ 构建出来的库, 加载完后调用了 OnHotFixLoaded 方法调用测试代码

      void OnHotFixLoaded() 
          //HelloWorld,第一次方法调用
          appdomain.Invoke("HotFix_Project.InstanceClass", "StaticFunTest", null, null);
      
      
    2. 修改 热更工程 中的对应的方法

      然后构建 dll 库

      导出文件 Assets/StreamingAssets/HotFix_Project.dll

      • 可以从模块配置中看到 导出目录编译宏 等编译配置

  5. 启动 unity

    成功看到修改后的内容


以上是关于unity热更新新方案,ILRuntime的主要内容,如果未能解决你的问题,请参考以下文章

Unity上面有啥好的热更新方案

为啥Unity没有实现iOS平台代码热更新

Unity 热更新技术 | 热更新的基本概念原理及主流热更新方案介绍

Unity2020 几种常用热更新方案的优劣及XLua实战

unity3d的资源管理和热更新方案

unity3d的资源管理和热更新方案