李和明
摘 要:Unity技术的迅速崛起,让3D移动游戏逐渐流行。随着游戏系统的不断丰富,游戏开发迭代速度迅速加快。但Unity的原生C#开发效率较慢,而且在部分平台上无法进行热更新,无法满足游戏开发商的需求。文章旨在将Unity与腾讯开源项目XLua结合,设计并实现Unity脚本框架,让游戏开发商专注于游戏设计与逻辑开发,加快游戏开发效率,减少开发成本。
关键词:游戏开发;Unity;XLua;脚本
全球手机用户数量已经超过50亿[1]。随着通信信息技术的快速发展与智能手机的普及,以及手游在渲染和表现力上的优化,越来越多的智能手机用户选择手机游戏作为新的娱乐方式[2]。由于Unity技术的迅速崛起,移动3D游戏逐渐流行起来,大量的开发人员与团队投入到开发3D游戏的行列。随着移动游戏的玩法越来越丰富,产品的迭代越来越快,如何保持用户的新鲜感成为游戏开发的核心。直接使用C#的开发效率较慢,成本高,且在部分平台较难进行热更新的问题逐渐暴露出来。如何提高开发效率、减少开发成本并让游戏更简便的热更新成为游戏开发商的迫切需求。
Unity的脚本化不仅可以大幅提高开发效率,减低开发成本,还能使用热更新让用户可以直接更新游戏而不用重新下载安装包,可以满足游戏项目研发的实际需求。现在有许多游戏开发商都在进行游戏脚本化的研究,但由于成本问题只进行了部分脚本化,即只有少部分经常需要改动的功能采用脚本开发,大部分功能依然是使用C#开发。部分脚本化效率提升有限,且项目中的逻辑代码分散在C#部分和脚本部分中,不易于管理。本文尝试结合腾讯公司的开源项目XLua,设计并实现Unity的脚本框架。
1 Unity开发技术
1.1 Unity游戏开发
Unity也称作Unity 3D,是近几年非常流行的一款3D游戏开发引擎,其特点就是跨平台能力强,移植便捷[3]。Unity 3D几乎已经成为快速开发3D游戏的必备工具。Unity开发分为原生开发与脚本开发。
原生开发是指使用Unity官方提供的C#环境进行开发。使用C#语言进行开发可以直接调用官方提供的各种接口,且官方和民间均提供了大量的文档[4],学习门槛较低。
而脚本开发是指通过Unity插件,可以让Unity支持使用Lua语言进行开发,把一个C#实现替换成Lua实现,并通过与C#交互的方式调用官方接口。官方虽然没有提供Lua脚本的相关文档,但Lua插件均已经在脚本运行环境提供了完善的方法去调用官方接口,且使用方式基本与C#一致,没有学习障碍。
1.2 Lua脚本开发与C#开发对比
1.2.1 热更新
热更新可以让用户只用下载容量较小的热更新包即可进行游戏内容的更新,由于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的脚本框架,牺牲少许运行效率,大幅提高开发效率与项目安全,让游戏开发商无需花费大量成本去进行引擎的脚本化,专注于游戏设计与逻辑编写,加快开发速度,减少开发成本,具有实际参考价值。
[参考文献]
[1]赵靓,张彦.浅析手机媒体娱乐化趋势产生的原因[J].消费导刊,2010(4):205.
[2]大鹏.基于Unity引擎的手机游戏客户端的研究与实现[D].西安:西安电子科技大学,2014.
[3]赵靓,张彦.基于Unity3D的飞行小鸟游戏的设计与实现[J].电脑知识与技术,2018(30):65-66.
[4]宣雨松.UNITY3D游戏开发[M].北京:人民邮电出版社,2012.
[5]EBERLY D H.3D Game engine architecture: engineering real-time applications with wild magic[J].3D Game Engine Architecture,2004(7):699-701.