转自:http://www.gamelook.com.cn/2015/06/218267
GameLook报道/ 6月5日,2015年第三期GameLook开放日?虚幻引擎专场活动在上海正式举行,此次活动由Epic Games与GameLook联合主办。
动作游戏凭借爽快的打击感和强烈的操作感一直受到玩家的喜爱,但一些高品质的3D动作游戏设计其实颇有难度,国内市场上常见的大多是横版2D游戏。本次活动上,Megafun的创始人张瀚荣来分享了利用UE4引擎制作3D横版动作游戏的心得。
张瀚荣从策划的角度分析动作游戏的制作流程,“先制作2D草图,通过这些草图检验动作的合理性,然后转化为3D模型,最后把这些动作变成招式。”随后张瀚荣着重介绍了UE4中通知系统的强大功能,“游戏中输入的判定、声音、音效、特效、伤害、传递给敌人的状态、取消机制、摄像机的抖动、定帧等所有事情都可以通过通知来完成”。
“伤害区域判定是难点”张瀚荣介绍了伤害判定设计的方法,“通过在人物身前编辑各式碰撞盒子,并通过Notify state控制这些盒子的开关以及变换”此外张瀚荣还分享了动作游戏中缓冲和取消机制的设计,“一个是简单的连招Combos,第二个是角色的特定能力包括角色的跳,还有刚才看到绳子的勾爪,把自己可以勾回去的那种,还有还有一些技能,然后设计这三者的总体逻辑”。
演讲最后Megafun的程序员具体演示了Notify state的使用方法并介绍了其优点,包括保证两个函数成对,方便设计者进行管理。
以下是演讲实录:
张瀚荣:大家好!我们公司正在使用虚幻4引擎在做一款3D的横版动作类游戏,目前代号“TTW计划”,团队在深圳。目前计划的平台只有PC和主机两个,手游并没有考虑太多。然后也计划在7月底China Joy发布一款试玩版。
首先看一段视频,因为我们的游戏太大了,有二十多个G,所以视频也是我花了一个通宵时间剪辑的,还有不少Bug的时候,比较粗糙,大家可以关注我们下一个月的版本。
先制作2D草图、再转化为3D模型
这次分享主要是我们如何使用虚幻4引擎来做一个动作类的游戏。经典的动作游戏有很多,比如说战神系列,鬼泣系列,还有国产的雨血等,都是在动作打击感上做得比较好的游戏。但很多人在做动作游戏的时候都会觉得它特别难做,摸不着它的门道。
动作游戏以我一个做策划的角度来讲主要分为三个方面:视觉、听觉、触觉,触觉就是连击操作的手感。我们的工作流程是这样的,首先制作2D的动作草图,通过这些草图的设计就可以看出动作合理还是不合理。然后根据这些草图在UE4里面做成3D模型的动作,并通过UE4中自带的Cascade这样一个工具来做特效。最后把这些动作变成一个招式,会在Montage中配置事件,这部分的事件非常多,非常烦琐,并在Animation Sequence中配置特效与音效。
这是一个简单的制作流程图,就是把工作任务拆分到不同的人员身上,而这一切的主题就是 “通知”。无论是Montage还是Animation Sequence中都会用到UE4里面独特的设定,叫Notifies,在下面这个位置。
功能强大的“通知”系统 控制连招判定 插入招式特效
通知是干什么用?通知是动画在特定的位置、特定的区域来做特定的事情。特定的事情包括哪些呢?包括输入的判定,声音、音效、特效、伤害、传递给敌人的状态、取消机制、摄像机的抖动、定帧等所有事情都可以通过通知来完成。
手感的来源其实第一个就是连招输入的判定,当你一招打出去要连下一招的时候,判定的时间是否合理的。对于手残党,像我这种来讲,我就会要求一个比较长的一个判定时间。但是对于高手来说,它可能更希望硬核一点。
缓冲我们的手感分为两个通知,包括一些即时响应和缓冲机制。缓冲机制是指获取玩家输入后,等待动画播放到某一帧后才跳转到下一段连招。即时响应就是获取玩家输入后,马上跳转到下一段连招。
那么我们在里面在里面我们是如何配置的呢?可以看到下面这个叫Attack Anim Notify State是我们制作的缓冲机制的判定,然后下面Stop Delay Notify代表不接受按键输入。也就是说在这一长度帧数里面,动作是允许跳转到下一个招式,但是最早的两帧内已经开始接收判定输入了。
特效很简单,就是在特定的某一帧做动作的特效,包括一些挥刀的音效。声音格式是WAV(16bit)的。
伤害区域判定是难点 编辑各式碰撞盒子
还有一个比较重要的是伤害区域的判定,这是动作游戏里面最难也是最核心的。这张图是引用《街霸4》里面框的艺术截图,他们分好多种的框。而我们实际需要的游戏框并没有这么复杂。
我们只需要在特定帧段判定攻击,过了这个帧段就不判定攻击了。通过自动调节判定框大小,调节判定框数量,来输出攻击所传递给每个受击者的状态。比如说这招打出去是需要传递它是浮空的状态,击倒的状态还是普通僵直的状态。
这是之前做的Slnow的配制表,我们通过Slnow的配制表来配置这一系列伤害框里面的一些信息,这个Startswing就是伤害的通知。然后在UE4的编辑器调节这些碰撞盒子的属性,所做盒子的位置,就是人物身前的位置。
我们也可以用通知系统去实现给角色自身添加一系列的状况,比如说在特定的某一帧给角色增加一个霸体状态,也可以无视一切碰撞检测,相当于无敌,蓄力、飞行、延迟出招等一些状态都可以通过通知实现。我们这里Charge,就是一个蓄力的通知,表示人物在蓄力需要重复播的一段动画。
缓冲和取消的机制的设定
动作游戏中也有缓冲和取消机制。缓冲是指这一招是否可以取消?相信大家玩过DNF它有一个后跳是强制取消所有招式和状态的,就是动作游戏的招式,你一招是否能取消?是马上取消还是要等到这一招出完又没有收招可以被取消,还是你的招式被特定类型的招式取消呢?这一系列设定非常核心非常细,但是都可以通过通知完成。
我们游戏中招式分三种,一个是简单的连招Combos,第二个是角色的特定能力包括角色的跳,还有刚才看到绳子的勾爪,把自己可以勾回去的那种,还有还有一些技能。总体逻辑是连招自身不能被打断,但是技能可以打断你的连招,能力也可以打断连招,技能是不能被任何东西打断,能力是可以无视帧数,在出招没开始的时候就打断当前的招式。
我们这里有一个Skilljumping notify,就是技能的取消机制,连招的取消机制刚才也说过,在这两个区域之内是可以取消的。
刚才我讲的通知是出于策划的角度怎样配置这一系列的事件,接下来程序员会讲通知里面怎样运作的。
Begin,End,Tick和GetNotifyName四种方法重写Notify state
Megafun程序员:大家好!我来跟大家讲一下如何编写通知的逻辑。在UE4,特别是做动作游戏的时候,角色挥一刀过去,在特定的某一帧需要执行一系列的操作,而这一系列的操作会有很多的功能。我们现在通过一个实例来分析一下,我们怎样去编写。
比如说一刀挥到这边来,此时伤害的碰撞格应该是进行开启,而在开启的过程中比方说他打到那边去,就需要关闭盒子。我们通过一个Notify state,来控制碰撞盒的开启、关闭以及变换。
具体操作很简单就是点击Open Full Blueprint Editor,打开NotifyState编辑界面。它有4个方法可以被重写,分别是Begin,End,Tick和GetNotifyName。在Begin的时候,就说明我接受到这个事件,所产生的事件的。End也是同理。Tick则是Begin和End之间Tick的事件,它有一个参数Deltatime。那Getnotifynoame就是我想看一下现在哪个Notify在起作用,但是我们一般不会用。
详细逻辑是在Begin的时候,在人物身上挂很多的碰撞盒,Begin时将盒子开启。在Tick,我们有一条Curve曲线,根据传入的曲线有一些变化值来调整碰撞盒的状态,可能是位置、大小也有可能旋转。在End的时候找到碰撞盒,然后将它关闭就可以了。其实代码比较麻烦,但是实际上伪代码就这么一点点,非常简单的一个信息。
配置是这样的,有一个Begin,中间就会产生Tick事件,然后我们会用一个用于编写动作游戏中碰撞盒的开启和关闭的逻辑。我们看到这里有三张图,这里一个测试盒来进行这样的演示,可以看到这是在第一帧,发现第一帧非常小,然后到那边是一个Tick,然后逐渐变大,这是我们当时实现的碰撞盒,这就是碰撞盒所对应的一个物体。
Notify state的好处:保证成对,方便管理
为什么我们用Notifystate,而不是用两个Notify+Player的Tick函数?首先是说我们有Begin,我们就要有End,叫成对调用。不可能一刀砍下去,这个盒子开了,或者在这个期间我被怪打了,我要没有调用到这个End的这个盒子就会一直开着,那样就出事了。
所以我们需要保持它是成对调用。在Notifystate,通过动画打断的一个事件,保证它调用Notifystate的End的函数,可以保证与Begin的成对调用。此外就是Begin、End、Tick他们三个是在同一个BP里面方便我们进行管理。所以建议使用Notifystate实现在动作游戏中玩家碰撞盒的开启、关闭。
我你们采用的是基于碰撞盒的武器攻击点,其实我也研究过,但是我想过另外一种方案,基于线性射线检测的方案。例如手里的任何一把长柄武器,我在武器上定两个点,每一帧进行检测,一旦产生碰撞就认为攻击成功。
张瀚荣:之前有考虑过通过一些,比如说直接在武器上绑定一个盒子,或者是通过一个特殊的方法去做一些检测,但是考虑到因为我们的动作非常快,每一次出招时间非常短。在这个过程中如果在武器上挂一个盒子会非常短,可能只有一帧,但是我希望我们的打击帧数在3帧以上的判定。
另外一点是我们的特效会做得比它的招式动作本身要夸张。比如说我一个角色实际上没有位移,刚才视频里面有一个镜头,就是向前这么大的圆弧的时候,没有任何角色位移,角色还是在原地,但是一瞬间就回来了。这种情况下只能通过在人物前方摆放盒子来实现。