一、什么是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将会在游戏开发行业中越来越受到大家的关注。