张瀚荣:如何用UE4制作3D动作游戏
转自: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帧以上的判定。
另外一点是我们的特效会做得比它的招式动作本身要夸张。比如说我一个角色实际上没有位移,刚才视频里面有一个镜头,就是向前这么大的圆弧的时候,没有任何角色位移,角色还是在原地,但是一瞬间就回来了。这种情况下只能通过在人物前方摆放盒子来实现。
张瀚荣:如何用UE4制作3D动作游戏的更多相关文章
- 基于html5制作3D拳击游戏源码下载
今天给大家分享一款基于HTML5实现的3d拳王游戏源码.这款实例适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器. 在线预览 ...
- 制作3D小汽车游戏(上)
之前一段时间家里和公司的事太多,一直没有时间写博客,最近腾出一段时间,看了一遍官方的examples,收货颇多,想整理一点东西出来,又苦于没有好的东西,three写点东西真是太难了.好吧,今天郭先生就 ...
- 制作3D小汽车游戏(下)
书接上回,这一节我们分模块说一说怎么写一个这样的游戏 1. 初始化场景.相机和渲染器 这几乎是绘制three必须做的事情,我们有两套场景和相机,一个是主场景和相机,另一个是小地图的场景和相机(用来俯视 ...
- 如何用 Keynote 制作动画演示(转)
原文:如何用 Keynote 制作动画演示 Keynote 里的很多特效可以用来制作效果不错的演示,一页页的将需要演示的内容交代清楚后,直接输出成 m4v 的视频格式,为了方便贴到博客或者发布到 Tw ...
- 网页特效:用CSS3制作3D图片立方体旋转特效
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...
- 制作3D图片立方体旋转特效
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>CS ...
- 教你如何用PS制作多款按钮UI设计教程
教你如何用PS制作多款按钮UI设计教程 本文教大家制作按钮的方法 LV. ★ 初入设计,学做按钮.只会套个底色,加个阴影,字体纯白,小聪明的弄个圆角. LV. ★★(描边.字体.内阴影) 看了很多案例 ...
- WPF如何用TreeView制作好友列表、播放列表
WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...
随机推荐
- 使用Mybatis整合spring时报错Injection of autowired dependencies failed;
这是无法自动注入,通过查找,我出错的原因在于配置文件的路径没有写对,在applicationContext.xml中是这样写的. <bean id="sqlSessionFactory ...
- 【译】:python中的colorlog库
本文翻译自colorlog官方文档 一. 描述 colorlog.ColoredFormatter是一个Python logging模块的格式化,用于在终端输出日志的颜色 二. 安装 pip inst ...
- RegularExpressions(正则表达式)
最近在不少地方用到了正则表达式,一直对这一块不太熟悉,今天写一些关于正则表达式的知识,一来是总结自己学的知识,二来今后忘记了可以及时的复习. 在java中想应用正则表达式带来的好处,必须先了解两个类, ...
- easyui-textbox高为0
之前在项目中也遇到过,一段时间没遇到这种问题居然又忘记了,想着还是在博客中记录一下,方便自己记忆,也供大家参考. 大家是否也遇到过easyui-textbox高为0的情况呢 像这样: 用户名:< ...
- hdu 5981 Guess the number
Guess the number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 160000/160000 K (Java/Other ...
- 在Hive中使用Avro
作者:过往记忆 | 新浪微博:左手牵右手TEL | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<在Hiv ...
- hive 权限:Authorization failed:No privilege 'Create' found for outputs .
创建表报错: create table test ( name string ); Authorization failed:No privilege 'Create' found for outpu ...
- DGA短域名(360样本) mark下 下次分析可以参考
一共100万,按照长度排序后的前2000个: aagst.cnacyke.wsaefrd.ccaiqxg.ukakplh.pwalurx.pwamsmz.ccaogtp.inawwgf.inayveg ...
- 【poj2553】The Bottom of a Graph(强连通分量缩点)
题目链接:http://poj.org/problem?id=2553 [题意] 给n个点m条边构成一幅图,求出所有的sink点并按顺序输出.sink点是指该点能到达的点反过来又能回到该点. [思路] ...
- python基础之函数名称空间与作用域