前段时间关于Unity是否适合国内手游/网游创业团队的讨论很是火爆,本文从《蒸汽之城》的开发历程谈起,对于国内网游团队是否应该选择Unity引擎,以及如何解决使用Unity开发网游时遇到的各类主要问题进行讨论。程序员
厦门梦加的蒸汽之城数据库
《蒸汽之城》是厦门梦加网络的第一款做品,使用Unity引擎制做的蒸汽朋克风3D实时战斗MMORPG页游。游戏拥有幻想工业时代恢弘苍凉的场景;丰富的种族、职业和技能系统;和端游比也绝不逊色的优质画面和特效;各式各样的副本挑战和PvP活动;最后,全部这一切用户都能直接在浏览器中以极短的下载时间享受到。《蒸汽之城》被包括福布斯、Massively、ZAM等知名媒体列为2013年最值得期待的MMORPG游戏之一,目前已经签约了多家海外发行商,范围覆盖全部英语国家、东欧、土耳其和中东。土耳其版本已经于3月1日(北京时间)正式开始公开测试。编程
梦加团队当初选择Unity引擎的缘由和大部分团队相似,快速出原型、大量现成的内置功能和中间件、支持在浏览器里展现高素质的3D游戏画面。在几年的开发过程当中团队才慢慢认识到用Unity开发MMO页游须要克服太多问题和陷阱。幸运的是咱们最终克服了绝大部分问题,《蒸汽之城》也即将开始海外公测。下面咱们会深刻探讨要完成一个高素质的Unity页游MMO,应该解决哪些技术问题和怎样建设团队。浏览器
请注意,这里咱们不会讨论使用Unity制做单机游戏,由于Unity单机或者有社交功能的手游都有太多成功的巨无霸例子,不少开发者也经过自身经验代表小团队使用Unity制做轻量级的单机或社交游戏并没有太大障碍,下面咱们仍是以多人在线,须要后台和大量数据处理的MMORPG为例来讨论。虽然梦加到目前为止都一直在开发浏览器版本的游戏,但其中不少技术话题对于多人手游项目也一样适用。安全
从传统页游到次世代技术服务器
虽然Unity已经有了7年多的历史,这款引擎从诞生之初就一直保持了比较先进的设计理念,包括其一直以来的首要卖点:为开发者提供基于浏览器的高素质3D游戏解决方案。Unity的特点既包括面向独立开发者的快速原型、低成本跨平台发布,也在近年来整合了更多高端商用的中间件和次世代的渲染技术。使用Unity如今已经能够开发素质几乎达到用Unreal Engine、CryEngine这些次世代引擎开发的游戏,Unity也被愈来愈多的AAA工做室选用来开发跨平台的主机游戏。网络
这意味着Unity很好很强大,没错,但不表明团队选择Unity就是理所固然的。商用引擎的一大特色是兼容并包,要适合各类不一样的项目和团队须要,而做为次世代引擎,其中又包括了大量图像、动画和资源管理的先进技术。对于初创团队来讲,选择Unity虽然获得了一大堆能够快速见效的功能,但面对这些功能时如何取舍,以及对引擎技术的理解和挖掘程度,都会对项目的命运形成决定性的影响。架构
Unity虽然一直以易上手、原型快速、中间件丰富整合快速著称,但随着项目规模和复杂程度的上升,很快开发团队就会进入一块网上各类单机游戏教程没法涵盖的真空地带,而国内网游技术分享的环境又相对比较薄弱,这时在一些关键的技术难题上,初创团队就会遇到很大的麻烦。从快速原型到攻克大规模项目的技术难题之间,一般是让不少团队没法正确估计成本的危险过渡地带。这也是不少使用Unity的项目结果反而不如使用自主开发的引擎或相对老旧引擎的缘由。自主引擎任何功能都要本身开发,相对老旧的引擎功能较为局限,因此在内容和功能规模方面的计划通常不会太过狂放;而Unity这样的引擎包括从官方和社区的宣传上都给人一种处处都是随手可得的免费午饭的感受,反而会让团队的计划更加激进,对困难认识不足。编辑器
下文中咱们会对这些危险和解决方案进行逐一的分析,但愿能给经验不足的团队提供警示和提早准备好解决问题的思路。分布式
内容规模和版本控制
开发者在不一样类型和规模项目的经验,很大程度上形成了对”Unity是否适合手游/页游创业团队“这一讨论两极分化的见解。对于以《Temple Run》、《亡灵杀手》等游戏为榜样的单机游戏开发者,以及CSR Racing这样有多人对战模式的单机游戏,即便团队很小使用Unity开发都不会遇到什么太大的问题。这些单机游戏很是适合发挥Unity游戏性成型快的优点,而内购、社交等功能均可以用现成的中间件来快速实现。
当使用Unity制做有海量内容的网游时,团队遇到的第一个问题,就是没法把游戏的所有内容放进一个Unity项目中。一方面资源文件数量达到必定程度后,每次开启项目的导入过程就够你泡壶茶;另外几十人的团队共用一个项目,在版本控制和数据安全性方面也会有很大的危险,任何人的操做失误均可能致使整个项目瘫痪;最后不一样分工的开发者须要面对的项目数据和工做流程差异很大,共用同一个项目会在很大程度上下降生产效率。
《蒸汽之城》使用了不少个Unity项目来为各个不一样的部门和小组提供定制的数据范围,工具和流程。3D角色美术的项目里只使用角色数据(FBX->Prefab)和相关的预览和打包工具;场景美术使用不一样的项目来管理不一样的场景;客户端程序员使用的是主要的客户端项目,他们的代码运行后能够读取其余开发者上传到服务器上的数据,从而让游戏跑起来。而大部分开发者可使用编译成可执行文件的客户端来测试本身随时向测试服务器上上传的资源和设计数据,从而既保证了每一个人能最高效在本身的领域里工做,又保证了本身生产的内容可以随时在游戏版本中测试。
如此多的项目要怎样实现版本控制呢?咱们的解决方案是用Gitlab做为统一的管理平台,每一个项目做为一个单独的Git Repository(仓库)。使用Git的最大优点在于客户端项目的版本管理,客户端项目随时都有多名程序员在提交代码,使用Git就能让他们把测试代码和稳定代码经过不一样分支(Branch)来管理。咱们使用master分支做为稳定的版本,来合并每一个程序员提交并测试经过的我的测试分支;整个团队使用的可执行客户端用master分支来编译建立,就保证了新功能开发的速度和主版本的稳定性。
另外一个优点在于Submodule的使用,经过Git的submodule功能咱们能够在不一样项目中共享一份核心的底层代码和部分工具代码,这样就不用为每一个项目分别进行游戏引擎和工具更新。Git做为目前最早进的分布式版本控制系统,在掌握难度上是很是高的。国内网游团队即便是程序部门使用Git做为版本控制系统的状况也不是太多,而梦加作到整个团队都用Git做为平常的版本控制系统,付出的努力虽高,但回报绝对物有所值。
数据处理和工具开发
近期的讨论中不少人认为Unity的短板之一在于偏重代码驱动的引擎没有办法处理大批量的数据,这种印象可能跟官方和社区对于那个运行超级方便、什么工做都能往里放的MonoBehavior类的大力宣传和依赖有关。实际上Unity里除了MonoBehavior还有使用.NET标准的自定义类,有用法很是灵活的统一数据类型scriptableObject,还有各类各样只有你想不到没有你作不到的编辑器脚本和数据处理接口。只不过除了MonoBehavior,其余一切数据处理手段都须要开发者去Unity的官方论坛和StackOverflow这样的泛编程问答站点深刻挖据。官方论坛上经过搜索,实际上是能找到不少使用Unity作大数据量网游的同行讨论的,只不过这样的引擎在国内尚未造成很大规模的知识分享社区,一些作的比较久的中文Unity论坛也缺少网游项目的讨论,因此给人的印象就是Unity不擅长作这个。
事实上,Unity处理各类数据类型(XML,Json,SQL)都有现成的接口(用户提供和分享的开源代码),而《蒸汽之城》策划团队平常使用Excel格式的数据配置,也能够很容易的转化成XML后经过编辑器脚本导入Unity。最后客户端只要读取和处理导入后的scriptableObject就能够了,一些改动频繁的数据还能够直接使用XML格式在运行时读取,减小客户端须要更新的频率。
说到数据处理使用的编辑器脚本,这里就必需要探讨工具链开发的问题。对于任何大型项目,开发配套工具都是相当重要的,Unity的特点在于编辑器自己有着很是优秀的可扩展性,因此咱们使用的工具链包括编辑器脚本和外部工具两部分,分别用来处理客户端和服务器端须要的数据。好比任务逻辑和对话的编辑器是直接编辑数据库的,因此咱们使用VC制做的外部编辑工具。而包括关卡、资源导入、贴图合并、NPC角色打包等等要处理Unity使用的资源数据的工具,都是使用Unity脚本制做,开发者经过菜单命令就能够快速完成资源管线操做和编辑。
一款数据量很大的网游在工具开发和维护方面须要投入的力量是很大的,《蒸汽之城》在增长了工具开发的人手后,其余开发和资源生产部门的工做效率都获得了显著的提高。此外经过不断改善工具的可用性,加入大量对用户操做的预先检定,能够有效的减小操做失误形成的数据错误,提升了游戏版本的稳定性。
原型碎片和整合测试环境
上面提到Unity里能驱动一切的MonoBehavior类为原型开发提供了很大的方便,但做为网游项目,任何功能和资源都须要在游戏实际联网运行环境下进行测试。如何在Unity网游项目中平衡原型开发和实际联网测试呢?项目早期基础功能的原型,包括动画系统、图像渲染、角色换装等等,都是能够直接创建单机原型的。用脚本实现基本功能后再加上编辑器脚本和GUI脚原本为测试加上配套工具,而后再交给资源生产部门来添加游戏中的资源。
地下城、任务和战斗系统由于涉及到不少和服务器端的通信部分,若是须要测试就必须使用一个支持最简单的客户端服务端架构的单元测试档案配置。这里所说的档案,就是定义了你所有测试内容数据(或者去哪里找这些数据)的scriptableObject。包括你用来测试的账号、角色信息、测试场景、任务或技能配置等等。以主城和地下城为游戏内容载体的《蒸汽之城》里,咱们也制做大量测试用的地下城或主城场景做为任务和新功能生产的测试环境。测试环境由美术或策划来制做,而后交给程序部门来测试代码,最后再交给QA测试刚完成的功能。
Unity的强大原型制做能力主要仍是应该体如今项目初期。一旦客户端服务端架构造成,能够在稳定的服务器环境上运行游戏之后,开发团队就应该把更多的精力集中在如何可以在实际服务器上快速添加新内容并进行测试。《蒸汽之城》有过三组测试服务器,分别用来进行代码、资源和网页接口的测试;此外对于须要频繁更新调整数据的任务策划和关卡设计人员,他们会使用在我的电脑上架设的服务器,来避免数据更新对其余人测试带来的干扰。
动态下载和读取
对于网页游戏来讲,若是不能作到快速启动和最小化下载等待时间,相对于端游的优点就不存在了。《蒸汽之城》里全部美术资源都被拆分红了很是小的零件,这样用户只要下载一次,就能够在运行游戏时根据须要来动态组合,大量减小了资源的重复下载率。而地下城制做的时候会使用工具进行Serilization,游戏时每一个地下城只须要下载一份XML表单,而后就会自动从用户已经下载的“资源零件”中寻找须要的部分并进行动态拼装。体验过《蒸汽之城》的用户能够发现任何地下城的读取都不会超过数秒。
接下来讲说Unity页游的一大招牌Asset Bundle的使用。Asset Bundle是能够被用户stream下载的资源包,其中能够包含任何Unity Project中的文件。要作到动态下载,游戏中的绝大部分资源就都必须打包成Asset Bundle才能使用。在《蒸汽之城》的开发过程当中,咱们为大部分资源生产者制做了Unity编辑器内的打包工具,只要选择相应的菜单命令就能自动完成打包和上传到测试服务器上。在之后的项目中咱们但愿能采用Resource.Load()和Asset Bundle结合的方式,客户端能够分别读取原始的资源文件来使调试更方便,而测试经过后又能够切换成使用Asset Bundle来保证游戏的动态下载正常运行。Asset Bundle还有不少创意用法,你们能够看看官网上Unite2012的相关讲座。
技术导向的团队建设
前面提到了Unity在项目规模和复杂程度从单机到网游的巨大增长,能够说若是对于国内大部分团队,使用Unity制做网游都有着必定的风险和挑战。简单的说,Unity对于单机游戏来讲,确实有不少“免费附加值”能够用来快速搭建项目和完善产品功能,但在网游或较大型项目层面,若是没有对于项目质量的较高要求,没有一个好的团队技术氛围和建设思路,选择Unity获得的免费回报和付出的技术建设成本实际是得不偿失的。
假如看官读到这里还对于使用Unity坚决不移,能够看看下面对于如何建设Unity适用型技术团队的一些建议。
但做为网游项目,任何功能和资源都须要在游戏实际联网运行环境下进行测试。如何在Unity网游项目中平衡原型开发和实际联网测试呢?项目早期基础功能的原型,包括动画系统、图像渲染、角色换装等等,都是能够直接创建单机原型的。用脚本实现基本功能后再加上编辑器脚本和GUI脚原本为测试加上配套工具,而后再交给资源生产部门来添加游戏中的资源。
地下城、任务和战斗系统由于涉及到不少和服务器端的通信部分,若是须要测试就必须使用一个支持最简单的客户端服务端架构的单元测试档案配置。这里所说的档案,就是定义了你所有测试内容数据(或者去哪里找这些数据)的scriptableObject。包括你用来测试的账号、角色信息、测试场景、任务或技能配置等等。以主城和地下城为游戏内容载体的《蒸汽之城》里,咱们也制做大量测试用的地下城或主城场景做为任务和新功能生产的测试环境。测试环境由美术或策划来制做,而后交给程序部门来测试代码,最后再交给QA测试刚完成的功能。
Unity的强大原型制做能力主要仍是应该体如今项目初期。一旦客户端服务端架构造成,能够在稳定的服务器环境上运行游戏之后,开发团队就应该把更多的精力集中在如何可以在实际服务器上快速添加新内容并进行测试。《蒸汽之城》有过三组测试服务器,分别用来进行代码、资源和网页接口的测试;此外对于须要频繁更新调整数据的任务策划和关卡设计人员,他们会使用在我的电脑上架设的服务器,来避免数据更新对其余人测试带来的干扰。
首先,团队项目负责人和技术骨干关注Unity官方发布的信息和社区技术热点讨论是必须的。好比说从Unity4开始就能够在手游上使用动态字体和动态阴影了,而这些消息的发布是在去年夏天的Unite先后,一直关注Unity新技术的团队就能够为项目提早作好特性计划。并且Unite上大量很是有价值的官方和开发者讲座,也能弥补不少官方教程和手册中没有涉及的空白区域,刚好是国内网游团队急需的(好比Asset Bundle使用讲座,Network基础讲座等等)。另一个很是重要的知识库是Unity的官方论坛( )和问答社区( ),这两个社区站由官方技术人员和活跃的。
Unity用户共同提供内容和维护。配合Google搜索,你几乎能够在这些社区网站上找到任何技术难题的答案,并且还会有各类实际案例的解决过程(由于提问的人极可能和你有着一样的问题)。固然使用这些官方社区必需要有较好的英语阅读能力,这自己就对技术团队的素质有了必定的要求。国内的Unity社区和资讯网站也在越作越好,其中像Unity圣典()和Unity教程手册系列( )都是不错的资源入口,建议英文不够熟练的朋友以这些中文网站为索引,慢慢将获取知识的渠道扩展到国外网站。
第二,Unity项目要造成有规律的从原型代码到结构化的重构的循环过程。Unity作原型快,又有不少现成的解决方案,在开发周期紧张的状况下,开发者很容易会不断添加快速完成的功能,最后让项目的结构臃肿不堪,内容扩展到必定程度就会遭遇新功能添加的瓶颈。也就是说,若是没有周期化的重构,项目功能扩展到必定程度后,再添加新功能或调整原有功能,其成本都会成倍上升。而太过频繁的重构又会影响项目进度,如何把握这个度,就要根据团队人员的结构来精心安排了。
第三,Unity大型项目很是适合从早期就规划好完整的工具链,根据不一样开发者的技能和使用习惯定制不一样的工具。对于我的开发者来讲,Unity里有大量的中间件能够知足不一样技术水平用户的须要。在网游团队中也能够用相同的思路来提升效率,应该尽可能避免只有程序员使用Unity,美术和资源生产都只局限在其余外部工具里的生产环境。另外工具链的功能扩展和完善是一个长期动态的过程,根据项目在不一样阶段的状态,对于工具需求的变化是很是正常的。建议团队从一开始就安排足够的人手开发工具,而且将工具维护和需求收集做为平常工做流程的一部分看待。
后4.0时代特性展望
Unity适用型技术团队的一些建议。
但做为网游项目,任何功能和资源都须要在游戏实际联网运行环境下进行测试。如何在Unity网游项目中平衡原型开发和实际联网测试呢?项目早期基础功能的原型,包括动画系统、图像渲染、角色换装等等,都是能够直接创建单机原型的。用脚本实现基本功能后再加上编辑器脚本和GUI脚原本为测试加上配套工具,而后再交给资源生产部门来添加游戏中的资源。
地下城、任务和战斗系统由于涉及到不少和服务器端的通信部分,若是须要测试就必须使用一个支持最简单的客户端服务端架构的单元测试档案配置。这里所说的档案,就是定义了你所有测试内容数据(或者去哪里找这些数据)的scriptableObject。包括你用来测试的账号、角色信息、测试场景、任务或技能配置等等。以主城和地下城为游戏内容载体的《蒸汽之城》里,咱们也制做大量测试用的地下城或主城场景做为任务和新功能生产的测试环境。测试环境由美术或策划来制做,而后交给程序部门来测试代码,最后再交给QA测试刚完成的功能。
Unity的强大原型制做能力主要仍是应该体如今项目初期。一旦客户端服务端架构造成,能够在稳定的服务器环境上运行游戏之后,开发团队就应该把更多的精力集中在如何可以在实际服务器上快速添加新内容并进行测试。《蒸汽之城》有过三组测试服务器,分别用来进行代码、资源和网页接口的测试;此外对于须要频繁更新调整数据的任务策划和关卡设计人员,他们会使用在我的电脑上架设的服务器,来避免数据更新对其余人测试带来的干扰。
前面说了些经验和建议,最后这里再说说Unity4.0后梦加的开发者还在翘首以待的功能。但愿提供给其余开发者做为技术评估的参考,也但愿Unity中国的大大们可以看到并帮助改进吧。
第一,Unity4开始全面进入了使用Retargetable(可重定向)动画技术和图形动画状态机的Mecanim的时代。Retargetable动画是游戏业的巨大福音,制做一套动画就能够适用于不一样的骨骼和蒙皮模型,对于项目生产来讲吸引力很是惊人。不过目前为止这个特性还不能用于页游的动态载入,由于负责动画Clip引用的Animator里不支持任何动态读取,能够说是阻碍页游项目全面升级Mecanim动画系统的最大障碍了。《蒸汽之城》在Unity3.X时代就开发了自定义的脚本FSM(有限状态机)来做为动画控制系统,尽管在Unity4里咱们已经可以使用Mecanim的Avatar来运行本地原型里的动画重定向,但由于不能动态读取加载,一直尚未在游戏中正式更换动画系统,很是的遗憾。
第二,Unity4里说好的新GUI系统无限期跳票。GUI的开发对于任何项目来讲都意味着很大的挑战和工做量,《蒸汽之城》的GUI使用的是Unity自带的GUI系统加上一套本身开发的设计工具来制做。在GUI的设计和图像生产方面已经作到了高效率,可是调整GUI功能时代码的修改量仍是太大了。尽管不少人在官方新GUI系统跳票以后已经转投了第三方中间件的解决方案,但做为有本身工具开发组,对项目扩展性要求很高的网游团队,始终仍是但愿可以拿到官方的解决方案来定制,而不是依赖于某个随时可能中止维护的第三方插件。因为Unity4.0目前GUI系统的悬而未决,咱们在配套GUI系统的优化方面也被迫遭遇了停滞。很但愿这个系统可以最终尘埃落定!
第三,Timeline功能神龙见首不见尾,并且更糟糕的是Unity彷佛已经再也不维护之前的Animation View了。Unity4里增长了完整的新动画系统Mecanim,但对于一些简单的UI或特效动画,不少时候开发者仍是但愿可以在Unity里快速调整和制做。Animation View在Unity4里效率降低,子物体动画曲线的显示也有些奇怪。而集更多功能于一身的Timeline在Unite2012上亮相以后却迟迟不见更新的消息。Mecanim是一个专门处理骨骼动画、动做捕捉、动画分层和融合的专业系统,但除此以外一个有时间线和关键帧的编辑器仍是对任何游戏项目都很是有用的,我的认为Unity团队不该忽略这方面的需求。
脚原本为测试加上配套工具,而后再交给资源生产部门来添加游戏中的资源。
地下城、任务和战斗系统由于涉及到不少和服务器端的通信部分,若是须要测试就必须使用一个支持最简单的客户端服务端架构的单元测试档案配置。这里所说的档案,就是定义了你所有测试内容数据(或者去哪里找这些数据)的scriptableObject。包括你用来测试的账号、角色信息、测试场景、任务或技能配置等等。以主城和地下城为游戏内容载体的《蒸汽之城》里,咱们也制做大量测试用的地下城或主城场景做为任务和新功能生产的测试环境。测试环境由美术或策划来制做,而后交给程序部门来测试代码,最后再交给QA测试刚完成的功能。
Unity的强大原型制做能力主要仍是应该体如今项目初期。一旦客户端服务端架构造成,能够在稳定的服务器环境上运行游戏之后,开发团队就应该把更多的精力集中在如何可以在实际服务器上快速添加新内容并进行测试。《蒸汽之城》有过三组测试服务器,分别用来进行代码、资源和网页接口的测试;此外对于须要频繁更新调整数据的任务策划和关卡设计人员,他们会使用在我的电脑上架设的服务器,来避免数据更新对其余人测试带来的干扰。
结语
制做网游或有联网功能的手游自己就是艰巨的工程,Unity让表面的一切看起来更美好和更容易,但不能否认普遍得到成功的Unity项目仍是以相对简单的手机游戏为主。在网游制做方面开发者能参考的知识和信息仍是太少了。梦加团队从零开始一点点的把Unity网游制做各个谜题拼起来,到了今天终于有了即将上线的高素质的页游《蒸汽之城》。但愿咱们这里总结的经验可以帮助国内业界的朋友们,咱们的解决方案也有不少不足的地方,但愿国内开发者们可以多多分享,促进Unity和网游开发技术的交流!《蒸汽之城》的中文本地化版本也在进展中,预计暑期就会跟你们见面!