10.ILR调用Unity

  1. 10.ILRuntime调用Unity
    1. 10.1 知识点
      1. 在ILRuntime工程中做一个主入口
        1. 主入口概述
        2. 在热更工程声明一个ILRuntimeMain了,提供启动静态函数,重新生成
        3. 在Unity调用ILRuntimeMain的启动静态方法
      2. ILRuntime调用Unity
        1. ILRuntime调用Unity概述
        2. 在启动函数创建空对象,可以创建出来
        3. 能直接使用Unity代码是因为引用了部分Unity引擎的dll,但是想直接使用其他模块可能使用不了,比如物理模块的Rigidbody就完全没有提示,也找不到类。我们每次自己写代码重新生成也会改Unity引擎的dll,所以自己写的Monobehaviour代码也能直接用
        4. 找到Unity中的程序集各模块引用,找到物理的dll,在资源管理器复制到热更工程的UnityDlls文件夹下,在热更工程添加引用
        5. 添加物理的dll后,可以正常使用并添加Rigidbody了,重新生成后可以在Untiy查看效果
        6. 会发现热更工程会把我们加的物理dll拷贝到StreamAsset下,可以先把他删了,再去热更工程选择我们新加的物理dll属性,把复制本地改成false,重新生成后不会复制到本地了
        7. 创建Lesson10_Test类,在热更工程有提示,也能直接添加
      3. 总结
    2. 10.2 知识点代码
      1. Lesson10_Test
      2. ILRuntimeMain
      3. Lesson10_ILRuntime调用Unity
    3. 10.3 练习题
      1. 练习使用热更工程调用Unity,特别是热更工程中的主入口,之后我们会在其中写大量测试代码,还要自己操作一次复制dll文件引用dll文件的流程

10.ILRuntime调用Unity


10.1 知识点

在ILRuntime工程中做一个主入口

主入口概述

我们在做有热更新功能的项目时
往往会有大量的逻辑是在热更工程中完成的
所以我们会在热更工程中做一个主入口
相当于是把逻辑处理权交给热更工程的感觉
类似在Lua热更相关知识点中讲解的相关内容

在热更工程声明一个ILRuntimeMain了,提供启动静态函数,重新生成

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class ILRuntimeMain
    {
        /// <summary>
        /// 把逻辑处理权交给热更工程
        /// 它是一个启动函数
        /// </summary>
        public static void Start()
        {

        }
    }
}

在Unity调用ILRuntimeMain的启动静态方法

ILRuntimeManager.Instance.StartILRuntime(() =>
{
    // 执行ILRuntime当中的一个静态函数
    // 静态函数中 就是热更工程自己处理的逻辑了
    ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Start", null, null);
});

ILRuntime调用Unity

ILRuntime调用Unity概述

就像在Unity开发中使用一样
引用命名空间后,直接使用即可
之所以我们能够直接使用
是因为热更工程已经引用了Unity对应的Dll文件

注意:
测试热更工程中 只关联引用了部分Unity相关dll
如果想要使用更多
只需要把对应Unity的Dll文件拷贝到热更工程中的UnityDlls文件夹中即可
再在热更工程中设置一下dll文件的引用

在启动函数创建空对象,可以创建出来

class ILRuntimeMain
{
    /// <summary>
    /// 把逻辑处理权交给热更工程
    /// 它是一个启动函数
    /// </summary>
    public static void Start()
    {
        // 使用ILRuntime创建的空物体
        GameObject obj = new GameObject("ILRuntime创建的空物体");
        obj.transform.position = new Vector3(10, 10, 10);
        Debug.Log(obj.transform.position);//(10.00, 10.00, 10.00)
    }
}

能直接使用Unity代码是因为引用了部分Unity引擎的dll,但是想直接使用其他模块可能使用不了,比如物理模块的Rigidbody就完全没有提示,也找不到类。我们每次自己写代码重新生成也会改Unity引擎的dll,所以自己写的Monobehaviour代码也能直接用




找到Unity中的程序集各模块引用,找到物理的dll,在资源管理器复制到热更工程的UnityDlls文件夹下,在热更工程添加引用






添加物理的dll后,可以正常使用并添加Rigidbody了,重新生成后可以在Untiy查看效果

Rigidbody rigidBody = obj.AddComponent<Rigidbody>();
rigidBody.mass = 9999;

会发现热更工程会把我们加的物理dll拷贝到StreamAsset下,可以先把他删了,再去热更工程选择我们新加的物理dll属性,把复制本地改成false,重新生成后不会复制到本地了


创建Lesson10_Test类,在热更工程有提示,也能直接添加

// 可以直接添加Unity自己写的脚本
obj.AddComponent<Lesson10_Test>();

总结

// ILRuntime跨域调用Unity中相关内容
// 相对更简单,和Unity开发中一样使用即可

// 需要注意的是
// 使用中如果无法正常使用Unity相关组件
// 都是因为热更工程没有引用对应的Unity相关模块的DLL文件
// 我们只需要找到对应DLL文件 复制到 热更工程中的UnityDlls文件夹中
// 并且在热更工程中引用 即可

10.2 知识点代码

Lesson10_Test

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson10_Test : MonoBehaviour
{
}

ILRuntimeMain

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class ILRuntimeMain
    {
        /// <summary>
        /// 把逻辑处理权交给热更工程
        /// 它是一个启动函数
        /// </summary>
        public static void Start()
        {
            //使用ILRuntime创建的空物体
            GameObject obj = new GameObject("ILRuntime创建的空物体");
            obj.transform.position = new Vector3(10, 10, 10);
            Debug.Log(obj.transform.position);//(10.00, 10.00, 10.00)

            //添加物理的dll后 可以正常使用Rigidbody了
            Rigidbody rigidBody = obj.AddComponent<Rigidbody>();
            rigidBody.mass = 9999;

            // 可以直接添加Unity自己写的脚本
            obj.AddComponent<Lesson10_Test>();
        }
    }
}

Lesson10_ILRuntime调用Unity

using System.Collections;
using System.Collections.Generic;
using BaseFramework;
using UnityEngine;

public class Lesson10_ILRuntime调用Unity : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 在ILRuntime工程中做一个主入口

        //我们在做有热更新功能的项目时
        //往往会有大量的逻辑是在热更工程中完成的
        //所以我们会在热更工程中做一个主入口
        //相当于是把逻辑处理权交给热更工程的感觉

        //类似在Lua热更相关知识点中讲解的相关内容

        ILRuntimeManager.Instance.StartILRuntime(() =>
        {
            //执行ILRuntime当中的一个静态函数
            //静态函数中 就是热更工程自己处理的逻辑了
            ILRuntimeManager.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Start", null, null);
        });

        #endregion

        #region 知识点二 ILRuntime调用Unity

        //就像在Unity开发中使用一样
        //引用命名空间后,直接使用即可
        //之所以我们能够直接使用
        //是因为热更工程已经引用了Unity对应的Dll文件

        //注意:
        //测试热更工程中 只关联引用了部分Unity相关dll
        //如果想要使用更多
        //只需要把对应Unity的Dll文件拷贝到热更工程中的UnityDlls文件夹中即可
        //再在热更工程中设置一下dll文件的引用

        #endregion

        #region 总结

        //ILRuntime跨域调用Unity中相关内容
        //相对更简单,和Unity开发中一样使用即可

        //需要注意的是
        //使用中如果无法正常使用Unity相关组件
        //都是因为热更工程没有引用对应的Unity相关模块的DLL文件
        //我们只需要找到对应DLL文件 复制到 热更工程中的UnityDlls文件夹中
        //并且在热更工程中引用 即可

        #endregion
    }
}

10.3 练习题

练习使用热更工程调用Unity,特别是热更工程中的主入口,之后我们会在其中写大量测试代码,还要自己操作一次复制dll文件引用dll文件的流程



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏