订阅程序员杂志RSS CSDN首页> 程序员杂志

UDK让小团队挑战iOS大作

发表于2013-12-23 11:41| 次阅读| 来源《程序员》| 0 条评论| 作者李伟

摘要:UDK是虚幻引擎的免费版,相比于虚幻引擎,UDK除了不能修改底层代码外,其他功能都得以保留,还会与世界上最先进的游戏开发技术保持同步更新。科幻射击类游戏《将死之日》是如何利用UDK制作出令人惊艳的iOS大作的?

UDK是虚幻引擎的免费版,相比于虚幻引擎,UDK除了不能修改底层的C++代码外,其他功能都得以保留,并且还会与世界上最先进的游戏开发技术保持同步更新。本文将结合一款科幻射击类游戏《将死之日》,谈谈如何利用UDK制作出令人惊艳的iOS大作。

虚幻引擎(Unreal Engine)是EpicGames出品的目前最受欢迎的游戏引擎之一,它使得游戏开发简单有趣。基于虚幻引擎开发的著名IP数不胜数。包括Epic自家的《战争机器》、Irrational的《生化奇兵》、BioWare的《质量效应》、RockSteady的《蝙蝠侠》,以及UBI的《细胞分裂》等, 可以说是这些强大的品牌支撑着当今的主流游戏产业。

UDK是虚幻引擎的免费版,《将死之日》采用UDK开发,相比于虚幻引擎,除了不能修改底层C++代码,Unreal Engine3的其他功能都得以保留。强大的UnrealScript脚本语言能帮你实现想象力之内的任何游戏性。关卡编辑器、粒子编辑器、 Kismet、AnimTree等强大的工具使用起来高效有趣。

为什么选用UDK?

  • 功能强大:Unreal Engine3的全部功能都得以保留。
  • 同步更新先进的游戏开发技术:UDK每天都在更新虚幻引擎的最新技术,每月都会有UDK新版本发布。
  • 不可估量的成长曲线:使用UDK获得成功的游戏公司有很多:开发《地牢守卫者》的Trendy,起先使用UDK将他们的游戏发布在PC平台上,后来移植到 iOS,《地牢守卫者》在两个平台都获得了巨大的成功;Phosphor Games使用UDK发行了自己的第一款游戏《黑暗牧场》,尽管这款游戏没有取得巨大的商业成功,但为后来开发《号角》奠定了基础。
  • 使开发者尽可能专注于游戏性实现,而不用操心底层的引擎架构。Epic Games一直为UDK进行更新和维护,UDK为我们提供了完美的游戏开发解决方案。对于小团队,引擎开发和维护的代价是巨大的。UDK不能进行底层C++代码修改,但强大的UnrealScript可以帮助我们实现想象力之内的任何事。
  • 可以移植到众多平台,轻松将你的游戏发布在PC和iOS上。
  • 为小团队节省成本:Epic规定,使用UDK在收益超过5万美元之后才需要向Epic支付25%的收益,这为小团队剔除了很多商业风险。

Unreal Engine3为开发者提供什么?

  • 渲染引擎:使用材质编辑器可以让美术人员利用节点编辑法实现种类丰富的材质表现;粒子编辑器可以制作表现力丰富的粒子,同样,UDK为我们提供了强大的功能,大大缩减了粒子制作的限制。
  • 逻辑引擎:UnrealScript让开发者紧紧围绕游戏性去实现有趣的内容,Epic为我们提供了全面的技术解决方案,例如AI和动画混合。 Kismet可视化编程语言让游戏关卡设计师轻松实现关卡可玩性交互,AnimTree让动画程序开发者得以从硬编码解放,轻松实现角色的动画过渡。
  • 第三方应用:Scaleform是非常酷的GUI解决方案,结合Flash可以做出3D UI和炫目的UI动画。大家可以想想《死亡空间》中的炫酷立体UI;SpeedTree,可以加快节点式制作,让美术人员可以在一天之内学会做树模型,甚至比传统的3D Max美术人员更加高效;simplyGon快速删面工具;移动平台的机能有限,simplyGon可以帮助3D美术人员对模型进行快速减面工作;Bink,世界上最好的游戏视频压缩方案,可以将视频压缩到很小,同时保留很高的画质,GTA5中许多游戏内置电视机播放视频使用的就是这种技术。

科幻游戏

开发不同题材的游戏需要的技术手段是不同的,我们想将《将死之日》开发成为一款有故事走向的第三人称科幻射击游戏,这在iOS平台上大家可能会想到EA发行 的两款大作——《死亡空间》和《质量效应》。开发这种类型的游戏主要有以下挑战:1. 画面表现力强;2. 过场动画制作繁琐;3. 难优化;4. 设计更好的操作方式,移动触屏射击游戏先天跛脚,不能给玩家提供很舒服的操作体验;5. 贴合游戏性的付费设计。

画面精美,运行流畅

如何开发一款画面精美又有高性能的iOS游戏呢?一直以来,让游戏跑得快的最初始方法便是从渲染着手,即删减内容和降低表现力,然而这与“制作精美”的游戏理念是相违背的。有什么技巧能让你的游戏跑得更快而又不牺牲画质?降低Drawcall(如图1所示)!每次引擎准备好数据并通知GPU的过程就称之为一次Drawcall,这一过程是逐个物体及其单独材质进行的。每帧的Drawcall数值越大表示处理花费的时间代价就越大,你的游戏跑得就越慢。举个例子,如果你的摄像机视野之内有10个模型,每个模型有2个各不相同的材质,那么你的Drawcall数便是10×2=20。如果讲求方法,让你的模型师将这些模型进行塌陷打组,使10个模型成为1个,那么就是1×2=2个Drawcall。这样我们就将Drawcall缩减了10倍,虽然不会有10倍的性能提升,但你的帧率提高效果会非常显著。但这不是说将所有的场景模型全部塌陷到一起是正确的,因为这样做有一个弊端,哪怕模型的一个小角在摄像机视野内,便不会被渲染剔除。所以不是说将整个场景模型进行打组就会有很高的运行效率,要根据游戏的视角类型将游戏的关卡进行拆分打组,对于第一人称和俯视角游戏来说情况是大不相同的。模型打组和打组的规模,不同的情况要区别对待,把握平衡和技巧。


图1 任何平台降低Drawcall的原因永远是网格顶点数和贴图分辨率

不同的材质也是影响Drawcall的一项标准,如果可以的话尽可能将贴图压缩到一张。当然这在很多情况下是不可能办到的,通常俯视角游戏中,你的场景地面需要很大的贴图分辨率,可以让其保持单独的一张。但你可以让美术人员将道具模型的贴图尽可能压缩成一张,但压缩过度会使分辨率降低,这也是一种平衡。在虚幻引擎的模拟或是iOS真机环境下使用控制台的stat es2查看DrawCall,让其数值保持在20以内是不错的选择。

尽量不要使用 多维子材质,除非在特殊情况下,例如你的角色模型头部需要一个单独的材质,身体需要另外一种。半透明是非常耗费性能的,这样会使引擎进行渲染重绘。《将死之日》是一款俯视角游戏,树叶使用的是半透明材质,当摄像机被一片半透明的树叶几近遮盖时就会出现很明显的卡顿。

另一方面,角色动画是影响性能的重要因素,Animset为我们提供了多种动画压缩算法,应使所有动画都进行压缩处理。在做动画树时应该尽可能控制树枝的规模,过多的节点就意味着更多的实时更新和遍历,有时可以权衡一下是该切换第二套动画树好还是增加节点。

编程注意事项

UnrealScript 提供了众多的遍历方法,聪明地选择遍历方法可以让我们的游戏更加高效。在《将死之日》中,我们使用OverlappingActors来根据主角所在的一 定范围遍历敌人,根据角色朝向和与敌人间的距离计算权重,选取最优目标,调整让主角转向射击,我们使用这种方式实现的自动瞄准非常高效和流畅。最后,由于遍历本身非常耗费性能,应尽量避免使其在Tick中执行。《将死之日》的近战攻击使用线性检测,线性检测可以根据骨骼插槽做非常精准的攻击判定。线性检测性能消耗不可避免,在做线性检测时应该严格地把握检测开关,避免不必要的检测执行。如果你的代码中可以使用SetTimer就最好就不要使用Tick。前者可以指定一个较大的时间间隔做循环,后者每一帧都会执行,例如在做巡航导弹时你就没必要使用后者,也许在SetTimer中让巡航导弹每隔0.5秒检测敌人并调整扭矩就是个不错的主意。

在编程方面还有很多注意事项,优化工作从来不是一朝一夕的。Unreal Engine为我们提供了强大的游戏性调试工具GameplayProfile,可以让我们检测和跟踪游戏的性能。在运行游戏时启用控制台输入Profilegame start/stop,在GameProfile中打开我们的检测数据,我们将会看到自己的游戏性能波段和每个对象的性能损耗。

Kismet关卡逻辑

使用虚幻引擎做关卡设计的感觉无与伦比,Kismet可以帮助关卡设计师将许多很酷的点子快速实现,简单又有趣。《将死之日》在关卡可玩性方面做了很多文章,我们大量使用Kismet制作有趣的机关谜题。例如游戏中的门、电梯、火力旋板、切割激光等都是使用Kismet实现的。不仅如此,Kismet还可以实现更加复杂有趣的谜题,使用Kismet我们在游戏中安排了一些类似汉诺塔的谜题、激光反射谜题和多重电梯谜题。UnrealScript和 Kismet有多种交互方式。比如你可以在自己的代码中定义exec函数,然后在Kismet中consoleCommand进行捕捉。或是使用 RemoteEvent来通知Kismet执行一个动作。我们可以在UDK的Epic Castle地图中看到,Epic使用该方法来跳过摄像机动画。在我们的游戏中,每一个CheckPoint附近都有道具装备箱,当玩家点击道具箱时将会 打开道具装备页面,该功能是结合前面两种方法实现的。你也可以扩展自己的Kismet,例如我们扩展了PlayerStart实现了新的可存储玩家生成点,这样,当玩家达到一个CheckPoint之后便会记忆自己的生成位置。我们还用这种方法实现了一个播放按钮,用于探入Kismet中的Matinee,以便玩家能快进游戏的过场动画。

枪火系统

射击游戏的武器系统是最重要的一个环节,虚幻引擎先天为FPS游戏打造,开发者可以通过UTGame学习到大量的技术和技巧,然而直接继承UTGame是不 明智的,因为它的系统过于庞大繁琐。在《将死之日》的武器系统中,我们继承并扩展了InventoryManager,这是武器的管理类,在这个道具管理器中,根据玩家的武器解锁存储情况,初始化他手中能被分配到的枪支,在此基础上我们完成了枪支的购买和装备系统。许多iOS射击游戏仅仅是依靠外形和不同 的子弹粒子来做内购的,我们觉得如果不对枪支的功能进行拓展是一种遗憾。我们拓展了11把性能各异的枪支,为每把枪实现了与众不同的功能和射击体验。例如我们的冷冻枪具有《死亡空间》的打击效果,敌人被击中后材质变成蓝色并被冻结;反弹枪的子弹可以在墙壁上反弹;导弹枪对敌人会进行跟踪;还有电锯枪、激光枪……

还有近战,AnimTree可以轻易地让动画程序开发者实现动画混合,基于此我们能很轻易地让主角做上肢换弹和挥刀动画,同时又忽略过滤掉下肢的移动控制。最终实现的效果是,主角可以一边进行各个方向的判断移动,又可以在移动时进行填弹或挥刀。这里用到了AnimTree的 AnimNodeSlot节点,该节点可以让我们根据自己的骨骼来过滤动画,我们只让挥刀动画从腰部以上执行。关于挥刀攻击则可以让功能按钮做动画执行, 动画执行序列使角色进入近战攻击状态,在该状态中进行线性检测,如果敌人被检测插槽的轨迹扫过,会将其加入命中列表,并进行伤害处理。当然还得注意不能将命中敌人重复加入被攻击列表,以避免其在一次攻击中被伤害多次。

射击类游戏的操作

触屏瞄准的射击模式总是差强人意,这段时间我在玩一款俯视角射击游戏,名字叫《MeltDown》。该游戏有很清新的画面和讨喜的主角,使用大多iOS平台RPG游戏的操作方式:点击目标点移动,自动进行射击。进行过程中,手指经常会阻挡视线,该游戏的操作让我抓狂。于是我挖掘了几款成功的iOS射击游戏并 进行了分析:《MonsterShooter》在俯视角射击游戏中的操作是最为出色的一款,该游戏有双摇杆和自动射击这种双重设定,每一关开始前让玩家决定操作方式。这对于短小的关卡可以,但如果玩家长时间选择一种操作方式便会乏味,不适合大型关卡;《僵尸之城2》是Glu开发的一款射击游戏,游戏中玩家 不能自由射击,只有准星对准敌人之后系统才会自动开枪。不能开空枪!如果我要在《将死之日》中使用反弹枪打墙壁掩体后边的队友,使用这种操作方式是无法实现的。

在研究和测试了众多iOS射击游戏后,我决定为《将死之日》实现这种操作方式:双摇杆和自动瞄准的演化版本,双摇杆的操作最贴近主机游戏,但使用触屏玩久了会累,自动瞄准过于霸气,会使敌人被放风筝打死,这非常不Hardcore,于是我为自动瞄准赋予了气槽系统(如图2所示),为不同枪械设定不同的气槽衰减速度,类似于枪支的过热,气槽过热后玩家只能使用双摇杆射击,等待气槽恢复。


图2 左上角为模拟枪支过热的气槽系统

UI和HUD

前面提到效果惊人的GUI解决方案Scaleform,Scaleform可以让开发者轻易地实现UI动画和立体UI。遗憾的是,我们没有使用 Scaleform,因为团队中没有Flash熟手,因此我使用了Unreal的MobileMenu解决方案。使用MobileMenu发挥点想象力实 现UI动画并非不可能。一般来说,UI动画有两种形式。一种是移动、缩放、旋转和淡入/淡出。这种实现方法比较简单,只需要将其顺应时间进行平移、缩放或旋转等变化。《将死之日》的初始界面有云的旋转,以及像《使命召唤》主菜单那样的雾平移效果,使用的都是这种方法;另一种形式是播放动画序列,拓展 MobileMenuImage,为其实现一个选取UV函数,我们制作了一些序列图片资源,以每秒14帧快速地调用该选取UV函数就能实现很流畅的播片效果。使用MobileMenu摆放UI位置和对齐是一件非常痛苦的事,需要程序员在美术的配合下填充数值。这不像Unity等一些引擎那样有UI编辑器, 操作起来很直观,当前的iOS设备具有不同的屏幕分辨率,由于我们使用一次发布iPhone和iPad平台,就得采取一些小技巧调节不同的屏幕分辨率UI 位置和大小。怎样让你的代码知道当前在哪个iOS设备运行呢?在HUD中可以根据Canvas.clipX和Canvas.ClipY获取屏幕长 宽,MobileMenuScene中根据InitMenuScene的ScreenWidth、ScreenHeight来获取屏幕像素长宽。

过场动画

终于到了过场动画,这也是我们现在正在着力制作的一个环节,鉴于Unreal引擎强大的Matinee使我们制作过场动画成为了可能。我们有很强烈的表达故 事的冲动,当前我们着力于完成过场动画,《将死之日》的过场动画大约有37分钟,对于一款iOS游戏已然非常庞大。纵观游戏领域,玩过一款游戏之后,我们耳熟能详的便是游戏的角色,《马里奥》让我们想到了马里奥,《战神》让我们想起了奎托斯,《神秘海域》让我们想到德雷克。一款好的动作游戏的角色能被人们记住,幻化成一种符号。好的故事能赋予游戏深度,过场动画能凸显角色增加趣味和内涵,带动玩家产生共鸣。我们将动画的节奏缩得非常紧凑,每一幕都有故事诉 求和冲突,或是交代人物出场,或是表现突如其来的转折,哪怕仅仅是表现暴力——暴力是残酷世界的最直接体现。

《将死之日》的过场动画是在 Matinee中编辑的,Matinee的强大之处类似于电影的剪辑工具,比那更强大的是结合关卡编辑器,你可以同时布控16台摄像机和所有角色的走位及 动画执行。可以说Matinee给操作人员赋予了表达电影语言的一切权利,声音加载、淡入淡出、景深等。在《将死之日》的过场动画制作过程中,我将整个故事写完之后交给导演,导演将故事在关卡中的发生位置进行细分(如图3所示)。


图3 使用游戏引擎可以让导演快速地规划分镜头

演在引擎中根据每一幕摆放人物调整摄像机视野,截图制作分镜,这样就节省了大量的画分镜工时。设计师根据分镜在Matinee制作不带人物动画的运镜和人物走位,到这个阶段会发生很多有趣的事情,每次测试时,镜头语言不可思议地为我们讲述了自己叙说的故事。在添加人物动画之后,看到自己的故事能准确表达的 那种感觉无可比拟。

总结

目前,7名开发者正在用才华和汗水着力将《将死之日》这款游戏打造成闪耀之作。我们很欣喜于游戏现阶段所展现的面貌。7个人为何能驾驭这么规模庞大的游戏呢?这得益于强大的虚幻引擎,让我们如同驾驭先进的太空船高速前进,而这个过程也给我们带来了很多收获。

  • 每个人都是多面手:开发过程中每个人都充分施展自己的才华。我们的原画师得进行UI制作、导演同时制作了所有的粒子、关卡设计师和导演配合制作过场动画、 动画师制作角色和道具模型、我负责所有的策划和程序,并且和两名关卡设计师一同搭建关卡。得益于灵活的人员配置,我们有很强的机动性。
  • 树立里程碑快速迭代:我们为每一个开发环节梳理了明确的Pipeline。这样做的好处是,如在关卡方面,每当完成一个很棒的关卡便会惊喜于自己的劳动输出,这会激励我们去构建下一个更有趣的关卡。
  • 热衷于使用新工具和技术:我们很热衷于使用新技术和工具帮助我们高效达成目标。例如在不能使用动作捕捉设备之前,我们研究了一套使用两个Kinect结合 Brekel来做动作捕捉的方案,效果尚可。庆幸的是得益于完美世界的帮助,让我们能使用它们的动作捕捉设备,现在的动画效果非常棒。
  • 努力和信念:我们为自己的热爱和信念付出了很多时光,看着这些努力聚合在一起闪耀,让我们为自己每一天的成长感到骄傲,坚信自己在做与众不同的事儿。

作者李伟,ORAP Games CEO,《将死之日》策划、程序、关卡和故事编剧。15岁开始编程和制作游戏,极致的游戏迷,专注汲取虚幻引擎的一切技术与知识。 

0
0

近期活动

更多

2015中国大数据技术大会

为了更好帮助企业深入了解国内外最新大数据技术,掌握更多行业大数据实践经验,进一步推进大数据技术创新、行业应用和人才培养,2015年12月10-12日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、北京中科天玑科技有限公司及CSDN共同协办的2015中国大数据技术大会(Big Data Technology Conference 2015,BDTC 2015)将在北京新云南皇冠假日酒店隆重举办。

微博关注

程序员移动端订阅下载

相关热门文章