您的位置:

Unity ILRuntime:一种快速高效的Unity C#运行时

一、什么是Unity ILRuntime?

Unity ILRuntime是Unity引擎下的一个高效的跨平台C#运行时解决方案。它是由ILRuntime开源团队基于Mono.VM开发而来,可以将C#代码在运行时进行JIT编译,同时支持热更新(Hotfix)和动态调用。

二、Unity ILRuntime的特点

1、快速高效:ILRuntime编译速度快,运行速度更是相当快速。在虚拟机实现的基础上,利用现代机器硬件的优势,加以优化,正常情况能达到C++代码的90%左右的性能,是Swig和Pinvokes等跨语言集成方案的数倍甚至数十倍之多。

2、跨平台:确保在Unity引擎下所有平台都能正常运行,包括iOS、Android、Windows、Mac、Linux等各个平台。这为游戏的移植和多平台快速迭代开发提供了很大的便利。

3、热更新:支持代码热更新,使用简单。

4、动态调用:支持在不知道类型的情况下进行调用,为游戏策划和开发人员提供了更灵活的开发方式。

三、Unity ILRuntime的使用方式

1、下载Unity ILRuntime包

https://github.com/Ourpalm/ILRuntime/releases

2、将Unity ILRuntime集成到项目

添加依赖包(DLL)到Unity项目中。

3、设置热更新的代码,比如一段函数

public void Say(string str)
{
     Debug.Log("You say:" + str);
}

4、在需要进行热更新的地方调用该函数

alertType.InvokeMember("Say", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.InvokeMethod, null, instance, new object[] { "hello" });

5、在需要更新的代码段更新代码

byte[] newDllBytes;
newDllBytes =你的更新包;

6、通过UnityILRuntime的API达到热更新的目的,并使得函数即可指向更新后的代码段。

ILRuntime.Runtime.Enviorment.AppDomain.LoadAssembly(newDllBytes);
instance = appdomain.Instantiate("TestDll.TestClass", true, ILRuntime.Runtime.Enviorment.ClInitFlag.All);
Type alertType = instance.GetType();
alertType.InvokeMember("Say", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.InvokeMethod, null, instance, new object[] { "hello world" });

四、Unity ILRuntime的优缺点

1、优点:

1)支持热更新,使得在游戏更新期间,玩家无需重新下载游戏即可体验新功能。

2)相较于P/Invoke和Swig集成方案优势显著,在大量操作时,性能优势和调试方便性和普适性优势,都强于P/Invoke。

3)相较于Lua集成方案,更加简单易用,能直接利用C#构建,较少的学习成本。

2、缺点:

1)需要学习和掌握ILRuntime底层技术,不利于尚未具备末位技术人员的学习和使用。

2)虽然说相较于Lua集成方案而言,确实是较少的学习成本,但是对于一些熟练掌握C#的程序员还是有一定的学习代价。

五、结语

Unity ILRuntime虽然也存在一些缺点,但是相较于其他集成方案而言,更具有灵活性和稳定性。在游戏开发中,使用Unity ILRuntime不仅能够实现代码热更新,还能为移植和多平台的开发带来便利。相信在不久的将来,Unity ILRuntime将会在游戏开发行业中越来越受到大家的关注。