引言
ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C++代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术,并提供相关代码示例。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
ILRuntime基本开发原则
- 理解两个不同执行环境:
- ILRuntime的逻辑热更项目中的类不能直接继承Unity C#项目中的类,Unity C#项目中也不能直接识别逻辑热更项目中开发的“组件类”。
- Unity C#的对象实例与接口在逻辑热更项目中不能直接new出来,需要通过Unity C#项目传递过来或直接调用Unity C#项目的接口生成。
- 逻辑热更项目的功能:
- 逻辑热更项目主要负责代码逻辑,使用Unity做好的资源、Unity引擎与Unity C#项目提供的基础服务。
- 热更新时,将逻辑热更项目生成的.dll当作二进制资源进行更新。
- ILRuntime项目的启动流程:
- 启动Unity C#的代码,下载并加载最新的逻辑代码.dll(逻辑热更项目生成)。
- ILRuntime解释器解释执行逻辑代码.dll,进入逻辑代码的入口。
- 逻辑代码使用底层的资源、Unity组件与底层C#开发的接口。
接口绑定技术详解
ILRuntime通过生成绑定代码,使得逻辑热更项目可以调用Unity引擎的API。这一技术主要依赖于.NET的.dll和ILRuntime的绑定机制。
- 绑定代码生成:
- 在进行.dll开发时,如果调用了其他.dll库,生成.dll时会为调用的接口做一个“符号”。
- 运行时,根据符号加载依赖的.dll,然后重定向这些符号,使得在调用时能够跳到正确的函数。
- 具体实现步骤:
- 安装ILRuntime插件,导入Unity3D。
- 创建一个热更新脚本,继承
ILRuntime.Runtime.CLRBinding.BindingCodeGenerator
,并实现GenerateBindingCode
方法。 - 在Unity3D中,通过菜单栏的
Tools->ILRuntime->Generate CLR Binding Code
生成绑定代码。
代码实现
以下是一个简单的例子,演示如何使用ILRuntime进行热更新及接口绑定。
- 创建热更新脚本:
using System; | |
using System.Collections.Generic; | |
using ILRuntime.Runtime.CLRBinding; | |
public class HotfixCodeGenerator : BindingCodeGenerator | |
{ | |
public override IEnumerable<Type> GetTypesToGenerate() | |
{ | |
return new Type[] { typeof(int), typeof(string) }; | |
} | |
public override IEnumerable<MethodInfo> GetMethodsToGenerate() | |
{ | |
return null; | |
} | |
public override IEnumerable<PropertyInfo> GetPropertiesToGenerate() | |
{ | |
return null; | |
} | |
public override IEnumerable<FieldInfo> GetFieldsToGenerate() | |
{ | |
return null; | |
} | |
public override IEnumerable<EventInfo> GetEventsToGenerate() | |
{ | |
return null; | |
} | |
public override IEnumerable<Type> GetCrossBindingTypes() | |
{ | |
return null; | |
} | |
} |
- 生成绑定代码:
- 在Unity3D中,打开菜单栏的
Tools->ILRuntime->Generate CLR Binding Code
,选择刚才创建的热更新脚本HotfixCodeGenerator.cs
,点击Generate
按钮生成绑定代码。
- 创建HotfixManager脚本:
using System.Collections; | |
using System.Collections.Generic; | |
using System.IO; | |
using UnityEngine; | |
using ILRuntime.Runtime.Enviorment; | |
public class HotfixManager : MonoBehaviour | |
{ | |
private static HotfixManager instance; | |
public static HotfixManager Instance | |
{ | |
get | |
{ | |
if (instance == null) | |
{ | |
instance = FindObjectOfType<HotfixManager>(); | |
} | |
return instance; | |
} | |
} | |
private AppDomain appDomain; | |
private void Awake() | |
{ | |
instance = this; | |
} | |
public void Init() | |
{ | |
appDomain = new AppDomain(); | |
string dllPath = Application.streamingAssetsPath + "/Hotfix.dll"; | |
if (File.Exists(dllPath)) | |
{ | |
byte[] dllBytes = File.ReadAllBytes(dllPath); | |
MemoryStream dllStream = new MemoryStream(dllBytes); | |
appDomain.LoadAssembly(dllStream); | |
} | |
} | |
public object Invoke(string typeName, string methodName, object[] args) | |
{ | |
object obj = appDomain.Instantiate(typeName); | |
return appDomain.Invoke(methodName, obj, args); | |
} | |
} |
- 在游戏启动时初始化ILRuntime并加载DLL:
void Start() | |
{ | |
HotfixManager.Instance.Init(); | |
// 其他初始化代码 | |
} |
- 调用热更新代码:
void Update() | |
{ | |
if (Input.GetKeyDown(KeyCode.Space)) | |
{ | |
// 假设有一个热更新中的方法名为"HotfixMethod",没有参数 | |
HotfixManager.Instance.Invoke("Namespace.ClassName", "HotfixMethod", null); | |
} | |
} |
结论
ILRuntime为Unity3D提供了一种高效的热更新方案,通过生成绑定代码,使得逻辑热更项目能够调用Unity引擎的API。本文详细介绍了ILRuntime的基本开发原则、接口绑定技术,并提供了具体的代码实现示例,希望能够帮助开发者更好地理解和应用ILRuntime。
更多教学视频
Unity3D
www.bycwedu.com/promotion_channels/2146264125