UH4L6——ILRuntime调用Unity

ILRuntime调用Unity

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

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

在ILRuntime工程中做一个主入口

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

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

ILRuntime热更新工程内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;

namespace HotFix_Project
{
internal class ILRuntimeMain
{
/// <summary>
/// 把逻辑处理权交给热更新工程,这是一个启动函数
/// </summary>
public static void Main()
{
Debug.Log("Hello, world!");
}
}
}

Unity主工程内

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;

public class Lesson9 : MonoBehaviour
{
void Start()
{
ILRuntimeMgr.Instance.StartILRuntime(() =>
{
ILRuntimeMgr.Instance.appDomain.Invoke("HotFix_Project.ILRuntimeMain", "Main", null, null);
});
}
}

ILRuntime调用Unity相关

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

image

例如想要在场景上创建空对象并设置位置,就如同Unity内那样编写逻辑即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using UnityEngine;

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

image

可见,空物体确实被创建了出来,并且被设置了位置

我们自己创建的脚本在ILRuntime里也可以正常的使用,因为热更示例工程已经关联了Assembly-CSharp这个程序集

image

image

添加ILRuntime内可调用的内容

注意

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

假设我们要调用Unity的物理系统相关的内容,我们需要物理系统相关的dll导入到UnityDlls文件夹中

image​​image

在属性窗口内查看其路径(在VS的菜单栏:视图 —— 属性 打开此窗口)

image

然后在资源管理器内找到该dll文件,复制它

image

然后粘贴到UnityDlls文件夹内

image

然后,在工程的引用处右键选项添加引用

image

最后选择复制的dll即可

image

至此,我们可以在项目里使用物理相关内容了,想要引用哪些Unity的内容,就导入哪个dll文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using UnityEngine;

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

但值得一提的是,如果直接重新生成,导入的dll也会被打包出来

image

这时,我们需要在导入的dll文件的属性窗口处,将 复制本地 设置为 False

image

这样,热更代码就可以正常的使用物理相关内容了

image