基于XLua的Unity脚本框架的设计与实现

摘 要:
Unity技术的迅速崛起, 让3D移动游戏逐渐流行。随着游戏系统的不断丰富, 游戏开发迭代速度迅速加快。但Unity的原生C#开发效率较慢, 而且在部分平台上无法进行热更新, 无法满足[…]

行游戏内容的更新,由于APP Store等一些平台不允许Unity游戏热更新C#程序库,必须使用Lua等脚本语言开发来实现热更新功能。
1.2.2代码权限管理
完善的代码权限管理可以让业务层的开发者接触不到核心引擎的代码权限,不仅方便进行代码权限管理,还可以防范核心引擎代码泄露。
1.2.3崩溃情况
错误的C#代码有可能导致游戏崩溃,而Lua代码出错一般只影响局部逻辑,可以上报脚本错误,方便后续解决问题。
1.2.4反破解
反编译等黑客技术让一个C#开发的程序几乎没有秘密,而使用Lua脚本后,脚本部分的代码可以使用加密并在运行时动态解密等技术,保证在进程空间内几乎没有完全代码存在。
1.2.5开发效率
C#开发过程中,项目中的任何改动均需要进行重新编译,随着项目体量的增大,会浪费大量时间在编译上。使用!Lua开发,任何改动均可直接运行项目看结果,不需编译,大幅提高开发效率。
综上所述,使用Lua进行开发可以大幅提高开发效率与项目的安全性[5。

2 基于XLua的Unity脚本框架设计与实现
2.1 XLua介绍
XLua是由腾讯公司维护的一个开源项目,使用XLua不
仅可以实现Unity脚本化,更可以在C#层出现BUG后通过热
补丁的方式将C#实现替换为Lua实现从而达到仅热更新Lua
脚本即可修复C#层BUG的目的。
2.2 Unity脚本框架的设计与实现
Unity脚本框架由主要由4个部分组成:脚本运行环境
(由XLua提供)、脚本管理器、脚本组件、脚本对象。
为了提高运行效率,脚本管理器采用单例模式,即游戏
程序的生命周期内,只有一个脚本管理的实例。
脚本管理器主要负责创建脚本运行环境,管理C#环境
与脚本环境交互的接口。为了让C#环境与脚本环境交互,还
需要使用到XLua提供的CSharpCallLua标签。使用该标签

的对象可以将脚本环境中的对象映射到C#环境中。
利用标签CSharpCallLua的特性,将Unity中需要使用的方法封装在一个使用CSharpCallLua标签的接口ILua中,并在脚本管理器中实现这个接口,让Unity基础组件的内置方法通过ILua与脚本环境进行交互。
除了实现接口ILua外,还需要设计一个脚本组件去处理C#环境与脚本环境的交互。其核心功能是将Unity内置的回调方法通过ILua与脚本环境交互。
为了提高运行效率,C#环境中并不保存脚本环境的实例,而是通过脚本组件的名字、通过ILua去获取对应脚本环境中的实例,并通过ILua进行交互。
同时,还需要在脚本环境中设计一个与脚本组件对应的映射对象LuaObject,并通过脚本对象管理器进行管理。在创建Unity的GameObject时,脚本对象管理器会自动创建一个对应的LuaObject映射到脚本组件上, LuaObject会通过ILua与C#环境交互。LuaObject在脚本组件被销毁时自动销毁并从管理器中移除。
3脚本框架性能测试评估
我们通过一系列的试验对Unity原生C#开发与各种Lua脚本插件实现的脚本框架进行测试评估。我们测试的内容如下:属性读写、成员方法调用、静态方法调用并返回、纯属性设置、构造valuetype返回。
3.1时间消耗测试
首先,测试时间消耗。为此我们通过相同的测试用例分别运行Unity mono (Unity C#) , XLua, ulua, cstolua。得到结果如表1所示。
从测试结果可以看出,所有脚本框架的时间效率都不如直接使用C#开发。但对比3种脚本框架, XLua插件的时间效率最好,与C#开发的差距较小。相差较大的是属性读取与写入和构造valuetype返回值。但这两项均可以通过优化代码逻辑去避免使用。

3.2 空间消耗测试
接下来我们进行了空间消耗的测试。由于所有插件实际
操作的均为Unity的对象,因此这里只对比不同插件所需的
额外空间消耗。测试结果如表2所示。

从测试结果可知,XLua是3种脚本插件中空间消耗最小
的。对比各项测试,空间消耗最大的是属性读取与写入以及
构造valuetype返回。因此,使用脚本框架时需要谨慎使用属
性读写与构造valuetype返回。
经过上述测试,我们可以发现,使用XLua实现Unity脚
本框架无论是空间消耗还是时间消耗,均可以满足项目实际
使用的要求。
4 结语
本文基于XLua设计并实现了Unity的脚本框架,牺牲少许
运行效率,大幅提高开发效率与项目安全,让游戏开发商无需
花费大量成本去进行引擎的脚本化,专注于游戏设计与逻辑
编写,加快开发速度,减少开发成本,具有实际参考价值。

0%