Fw: [分享] 我的Uncharted 4开发杂记

楼主: cjcat2266 (CJ Cat)   2016-05-11 12:25:12
※ [本文转录自 GameDesign 看板 #1NChG7lf ]
作者: cjcat2266 (CJ Cat) 看板: GameDesign
标题: [分享] 我的Uncharted 4开发杂记
时间: Wed May 11 12:24:33 2016
之答应过要写的,刚出炉热腾腾的Uncharted 4开发杂记~
网志版本 http://wp.me/p4mzke-WC
英文原文 http://wp.me/p4mzke-VD
系列清单 http://allenchou.net/my-career/
(强烈建议看网志版本,有精美除错截图唷)
Uncharted 4已经发售,终于可以分享我负责开发的部分了
我主要是负责单人模式的伙伴AI、多人模式的战友AI、还有一些游戏逻辑
没有收录到最终游戏的部分和一些琐碎的细工我就略过不提
= 岗位系统 =
在本文开始前,我想要先谈谈我们用来指派NPC移动位置的岗位系统
这个系统的核心逻辑不是我负责的,我写的是使用这个系统的客户端程式
岗位是可行走空间中的离散位置
大部分是用工具自动生成的,也有一些是设计师手动摆置的
基于不同需求,我们设计不同的岗位平分系统
(e.g. 潜行岗位、战斗岗位)
然后我们选择评分最高的岗位,指派NPC移动过去
= 伙伴跟随 =
伙伴跟随系统是继承自The Last of Us
基本概念就是,伙伴在玩家周为找个跟随点
这些可能的跟随点从玩家位置扇状分开
并且要满足以下的路径线段净空条件:
– 玩家到跟随点
– 跟随点到前方投射点
– 前方投设点到玩家
攀爬是Uncharted 4的新功能,这是The Last of Us 没有的
为了与现有的跟随系统整合,我利用攀爬岗位让伙伴可以跟着玩家一起攀爬
这个功能比我想像中的还要难搞
单纯根据玩家的攀爬状态来切换伙伴的攀爬状态,结果不甚理想
只要玩家快速在攀爬与非攀爬的状态之间切换,伙伴就会在两个状态间快速跳换
于是我加入了迟滞现象(hysteresis)
只有在玩家切换了攀爬状态,并且保持此状态移动一定距离之后,伙伴才跟进
广泛来说,迟滞现象是个解决行为跳换的好方法
= 伙伴带领 =
游戏中的某些特定场景,我们要让伙伴带领玩家前进
我把The Last of Us的带领系统移植过来
设计师使用spline曲线在关卡中标记他们想让伙伴带领玩家的大致路线
如果有多个带领路线,设计师则会用脚本语言切换主要的带领路线
玩家的位置投射到spline曲线上,再往前延伸设定为带领参考点
当带领参考点超越被标记为等待点的spline曲线控制点,伙伴会前往下个等待点
如果玩家走回头路
伙伴只有在带领参考点离此次推进至最远的等待点一段距离,才会回头
这也是利用迟滞现象来避免行为跳换
我也把动态移动速度调整的功能整合进带领系统
根据伙伴和玩家之间的距离,一些”速度平面”沿着spline曲线放置
伙伴有三种移动模式: 走路、跑步、冲刺
根据玩家撞到的速度平面,伙伴会选择不同的移动模式
另外,伙伴的行进动画速度也会基于玩家距离做微调
目的是避免切换移动模式的时后,有太突然的移动速度变化
= 伙伴掩体共用 =
在The Last of Us中,玩家和伙伴可以在各不离开掩体的状况下重叠
我们称这个为掩体共用
The Last of Us中的Joel伸手跨过Ellie和Tess按在掩体上
看起来很自然,因为伙伴的身型都比玩家娇小
但是同样的动作就不适合身型差不多的Nate、Sam、Sully、和Elena
而且Uncharted 4的游戏节奏较快
让Nate伸手去按掩体只会让动作流畅性打折扣
所以我们决定就单纯让伙伴靠紧掩体,玩家稍微绕弯避开伙伴
我用的逻辑很简单
如果玩家位置往移动方向投射的点,落在伙伴掩体周围的一个方框内
伙伴就会取消目前的掩体行为,并且快速靠紧掩体
= 救星战友 =
我负责多人模式的战友(sidekicks),而救星战友是其中最特别的
单人模式中的NPC,没有一个人的行为跟救星战友一样
他们会复苏被击倒的同伴,也会复制玩家的掩蔽行为
救星战友会尝试复制玩家的掩蔽行为,并且尽量待在离玩家很近的地方
所以当玩家被击倒的时后,他们就可以迅速跑过来复苏
如果玩家有装备救星战友的复苏包额外功能
他们会在采取复苏行动之前,朝被击倒的复苏目标丢复苏包
复苏包丢掷基本上就是延用手榴弹的抛物线净空测试和掷弹动作
只是我把手榴弹换成复苏包而已
= 隐蔽草丛 =
在隐蔽草丛中蹲行也是Uncharted 4才有的新功能
要实作这个功能,我们需要某种能够标记场景的手段
游戏逻辑才可以判断玩家是否身处隐蔽草丛中
我们一开始是让美术人员在Maya中标记背景模型的表面
但美术人员和设计师之间的沟通时间太长,很难频繁改进关卡
于是我们决定用另外一种方法标记隐蔽草丛
我在场景编辑器中的nav mesh增加了隐密草丛的额外tag
让设计师可以直接在编辑器中精准标记隐蔽草丛
有了这个额外的标记
我们也可以用这个资讯来为隐蔽岗位评分
= 感知 =
Uncharted 4没有像The Last of Us有聆听模式
所以我们必须要找另外一种方法,让玩家有办法得知附近的敌人威胁
好让玩家不会在未知的敌对环境中产生迷失感
我利用敌人的感知资料,加入了威胁标示
当敌人开始注意(白色)、起疑(黄色)、和发现(橘色)玩家
这些标示会适时地提醒玩家
另外,我在威胁标示开始累积的同时播放背景杂音,以制造张力
当玩家被发现的时候,则播放大声的提示音效
这些音效的安排和做用跟The Last of Us类似
= 调查 =
这是在我们送厂压片前,我负责的最后一个功能
我平常在Naughty Dog是不参加正式会议的
不过在送厂压片的前几个月,我们每周至少开一次会
由Bruce Straley或Neil Druckmann主持,专注在游戏的AI部分
几乎每次开完会之后,调查系统都有需要更动的地方
前前后后总共经历了好几次大改
会让敌人起疑的因素有两种: 玩家和尸体
当敌人起疑了(起疑者),他会抓最近的同伴来一起调查
离起疑点较近的人会成为调查者,另外一个人则是看守者
起疑者可能会视调查者,也有可能是看守者
我们总共有两组不同的对话,适用于两种不同的情况
(“那边有异状,我去看看” vs “那边有异状,你去看看”)
为了让双人调查看起来更自然
我使用了时域错位的技巧,让两人的行动和威胁标示时间点错开
否则两个人的行为完全同步,看起来非常机械式、很不自然
如果调查者发现了尸体,他会通知全部的同伴开始搜索玩家
尸体也会被暂时标示,以让玩家知道敌人为什么进入警戒
在某些难度下,短时间内连续触发调查,会让敌人的感应力变敏锐
他们会更容易发现玩家,即使玩家躲在隐蔽草丛中也一样
惨烈模式下,敌人永远处于敏锐状态
= 对话动作 =
这也是我负责的最后几个功能之一
对话动作系统负责操控角色,在对话的时候做出一些小动作
像是转头看其他人和肢体动作
之前在The Last of Us
开发人员花好几个月的时间,把整个游戏所有的对话脚本手动加注上对话动作
我们可不想再做一次这种苦工
在这个开发阶段,已经有部分对话脚本被手动加注好对化动作了
我们需要一个泛用型系统,可以帮没有加注对化动作的脚本自动产生对话动作
而我就是负责制做这个对话动作系统
动画师可以调整参数,改变转头速度、转头角度、注视时间、反复时间等
= 维持吉普车动量 =
开发初期遇到的问题之一,就是马达加斯加的吉普车驾驶关卡
当玩家开车撞到墙或者敌人的载具,玩家的车就会旋转失速以致脱离车队而关卡失败
我使用的解决方法是,当玩家的车撞到墙或者敌方载具的时候
短暂地限制吉普车的最高角速度和线性速度的方向变量
这个简单的方法相当有效,从此玩家就比较不容易旋转失速而导致关卡失败了
= 载具死亡 =
可驾驶的载具是首次在Uncharted 4登场
在这之前,所有的载具都是NPC驾驶、沿着固定轨道行进
我负责载具死亡的部分
摧毁载具有几种方式:
解决驾驶、开枪射车、开车撞飞敌方机车、开车撞敌方吉普车导致旋转失速
基于不同的死法,载具死亡系统会选择载具和乘客的死亡动画来播放
死亡动画会渐渐混入物理引擎控制的ragdoll系统
所以死亡动画会不着痕迹地转换成物理模拟的翻车
当玩家开吉普车撞飞敌方机车的时候
我使用机车在XZ平面上投影的bounding box和碰撞点
来判断要使用四个撞飞死亡动画中的哪一个
至于冲撞使得敌方吉普车旋转失速
我是拿敌方吉普车与默认行进方向之间的旋转量差来比较旋转失速判定阈值
载具播放死亡动画的时候,有机会穿透墙壁
我使用球体投射,从默认位置投射向载具实际位置
如果投射结果是与墙壁碰撞,则把载具稍微往墙壁的法向量移动
不一次完全修正误差,是为了避免太过剧烈的位移
我另外实作了一种特别的载具死亡类型,叫做载具死亡提示
这些死亡提示是动画师和设计师在场景中摆置好的客制化死亡动画
每个死亡提示在载具行进轨道上都有个进入范围
当一个载具在死亡提示进入范围中死亡,则会开始播放死亡提示的特殊死亡动画
之所以开发这功能,一开始是为了2015年E3展的超帅气吉普车死亡动画
https://www.youtube.com/embed/sB0xy74Zrj8?start=475
= 混色用的贝尔矩阵 =
我们想要消除摄影机切入看穿物体的瑕疵,特别是游戏中的各种植物
于是我们决定要让靠近摄影机的像素淡出
使用半透明像素并不是个好主意,因为非常消耗效能
我们使用的技巧,是所谓的混色(dithering)
https://en.wikipedia.org/wiki/Dither
使用混色技巧搭配贝尔矩阵(Bayer matrix)
利用一个预先决定的点阵模板来决定哪些像素可以舍弃而不渲染
https://en.wikipedia.org/wiki/Ordered_dithering
结果就是产生半透明的错觉
一开始使用的贝尔矩阵是个8×8矩阵,取自上述的Wikipedia页面
我认为这个矩阵太小,会造成不美观的带状瑕疵
我想要使用16×16的贝尔矩阵,但是网络上都找不到相关资料
于是我试着用逆向工程找出8×8贝尔矩阵的递回特性
光用目测法,我想我应该可以直接解出16×16贝尔矩阵
但是我想要让过程更有趣一点
我写了一个工具,可以生成二的任何次方大小的贝尔矩阵
换到16×16贝尔具阵之后,可以明显看到带状瑕疵的改善
= 爆炸声延迟 =
这个部份我其实没有什么大贡献,但是我还是觉得值得一提
在2015年E3展示中,Nate和Sully同时接收到高塔传过来的爆炸声和爆炸画面
这是不合理的,因为高塔距离非常远,爆炸声应该会晚一点才被接收到
我在开展前几周指出这点,美术团队后来就在爆炸声之前加上一小段延迟了
https://www.youtube.com/embed/sB0xy74Zrj8?start=50
= 繁体中文在地化 =
直到送厂压片前几周我才开始在游戏中改用繁体中文字幕,而我找到了许多错误
大部分的错误都是英文直译中文,而变成四不像的用语
我认为我没有足够的时间可以单枪匹马全破一次游戏又同时抓出翻译错误
于是我请几个QA部门的人分章节、用繁体中文模式游玩
然后我陆续浏览他们的游玩录制影片
结果这个方法相当有效率
我成功地把我找到的翻译错误建档,而在地化小组也有足够的时间修正翻译
= 结束 =
以上就是我对Uncharted 4开发上值得一提的贡献
希望大家读得愉快 :)
作者: knight77 (オニオンナイト)   2016-05-11 12:27:00
推cj
作者: chewie (北极熊)   2016-05-11 12:28:00
推推
作者: max005 (max005)   2016-05-11 12:28:00
未看先推
作者: LayerZ (無法如願)   2016-05-11 12:30:00
cj大推
作者: silvercomet (生存战略~!)   2016-05-11 12:35:00
有神快拜
作者: danny7615   2016-05-11 12:37:00
作者: leonh0627 (leon 蓝川)   2016-05-11 12:42:00
作者: globe1022 (肉食兔)   2016-05-11 12:46:00
推!
作者: iamOsaka (欧沙卡)   2016-05-11 12:51:00
神!!
作者: ian90911 (xopowo)   2016-05-11 12:57:00
酷 感谢分享
作者: aa000017 (Ophidian_Wang)   2016-05-11 12:58:00
推cj ! 好长慢慢看XD
作者: gn50711 (三分钟热度)   2016-05-11 13:02:00
作者: seedpk5079 (ooxx)   2016-05-11 13:06:00
作者: roc074 (安安)   2016-05-11 13:11:00
神说要有游戏,于是游戏就做出来啦!
作者: sthho (sthho)   2016-05-11 13:45:00
推!
作者: OlaOlaOlaOla (喔啦喔啦喔啦喔啦)   2016-05-11 13:52:00
先跪下来看就对了
作者: a1s2d342001 (风吹裤子飞)   2016-05-11 15:08:00
来推第3次
作者: a6115251 (台台)   2016-05-11 15:14:00
推!很难得看到有人分享开发过程!
作者: abucat (阿布猫)   2016-05-11 15:39:00
谢谢提供开发情报
作者: gogofight (gogo_fight)   2016-05-11 16:15:00
来c洽再推一次哈哈哈
作者: danny99 (Danny)   2016-05-11 16:40:00

Links booklink

Contact Us: admin [ a t ] ucptt.com