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