2018-07-06 13:36:57 285
刷Feed的时候看到有人翻出一个一年多以前的问题,问动作游戏都要在动作上编辑哪些参数,发觉自己已经比当初看到问题时多了很多可以说的东西,就准备了一篇回答,最开始是单纯为了整理帧事件的,然而发现不涉及到跳转信息之类的没法说明,于是越说越超纲,最后还是决定单独发了文章。因为还有开发任务,没法说到很细致,也懒得配图了,见谅。 这篇文章的主要关注点还是在Controller系统的整体结构,并不针对特定游戏,所以格斗游戏,狭义的动作游戏和ARPG可能都需要跑完这套系统,只是根据游戏类型在系统的特定部分拓展和配置。为了方便,很多东西都只是简单列下来,因为不同游戏的具体要求差别会很大,就不细说了。 希望对有兴趣的玩家和开发者有所帮助。 下面直入主题。 一般游戏的处理逻辑都可以简单拆成3个部分(参见Steve Swink - Game Feel, 2008)
当然也有更细致的划分方式,不过我主要还是从这3方面往下展开说。 1.接受输入 1.1. 输入设备与按键映射
1.2. 单一操作 简单按键:信号为0/1
蓄力:按下达到一定时间并松开 Trigger类按键:信号为0/1和一个0到1的浮点数,一般动作游戏不用那个浮点数 摇杆类:信号为一对0到1的数组
1.3. 复合操作 组合键
拖动:鼠标与触屏的特有操作组合
指令序列:主要用于编辑指令技表(不依赖动画序列的技表,如双击,236A,↑↑B)
◇每当完成一次有效输入后,向前一定时间回溯有效操作的序列,如果满足条件则生效 ◇比较典型的是如春丽28K这样的指令技,可以在角色没有动作响应时提前按下2积累时间,可以据此判断指令是在输入阶段即生效的,不依赖游戏逻辑和动画 2. 将玩家输入翻译成游戏逻辑 主要通过命令管理器Command Manager或者类似功能的模块来实现,玩家输入的指令被转化成命令,通过命令之间的关系控制输入过滤、按键缓存(Input Buffering)、打断与序列技表(依赖动画序列的技表,如AABBA) 2.1. 命令
◇当角色武器不同时,轻攻击指令会驱动不同的动画,需要命令管理器能够处理武器 -> 动画的映射关系,可能有一个武器Movelist需要维护,超纲不再细说。 2.2. 按键/命令缓存 一般序列技表的游戏都会使用,为了减少玩家输入精度的辅助措施,在上一个动作执行中按下下一个动作的指令,系统会记住该指令,到能执行的时候执行。 缓存时长这个值比较微妙,短了玩家感受不到,长了又会导致不受控制,目前的经验是最早跳转前0.2s为宜,具体情况视动画而定 格斗游戏不允许缓存所以有目押的严苛玩法,而魂系列经常因为按键缓存时间长而遭受诟病 一般原则是高级命令缓存覆盖低级命令缓存,同等级命令新命令缓存覆盖旧命令缓存 2.3. 命令/动画跳转时间轴 对接命令控制器,用于动画的跳转的驱动。因为担心不够精确,这里没有使用广大意义上前摇/后摇/取消的概念,而是这样的一个标准时间轴 动画开始 -> 缓存保护 -> 提前取消 -> 最早退出 -> 最迟退出 -> 命令重置 -> 动画结束
◇在缓存保护->最早退出时间段,玩家的输入命令可以缓存。 ◇缓存保护->最早退出时间段,原则上可以晚于动画结束时间,以创造类似“内置冷却”的效果
◇命令重置 -> 动作结束阶段,输入命令,则连技中断。如果连技X->X对应动画A->B, 在X命令重置后才追加X指令,只能触发A->A。 ◇最迟退出 -> 命令重置时间段,可以不处理,也可以开启另外一个缓存,在命令重置时间点后执行重置过的连技。 ◇最迟退出 -> 命令重置时间段也可以做成特殊跳转,实现A · A这样的等待攻击,在序列技表中也比较常见。 ■如果一节等待不够还可以加多节,常见于蓄力到不同阶段退出的指令技。 ◇命令重置时间原则上可以位于动画结束之后,可以实现多段翻滚的内置计数,攻击之后移动一段时间再攻击可以接上之前的连击这样的效果。 细则补充
◇轻攻击->移动一般只需要有最早退出时间一条即可正常工作(因为移动是一个如果不生效玩家就会持续输入的指令) ◇轻攻击->翻滚只需要提前取消和最早退出两条。 ◇只有在涉及到比较复杂的序列指令时才会有复杂的配置,例如同时出现 A->A,A · ->A,A -> A(长按),这类技表一般设计的时候就会避免。
◇当动画A处于到动画B的跳转过程中,这时候的新指令是响应A的跳转时间轴还是B的跳转时间轴? ◇当上一个命令的跳转时间轴超出动画本身之后,新的有效输入是用当前动画的时间轴,还是上一个(已经播放完的)动画的时间轴?
◇很多其他东西也有更直接/顺畅的实现逻辑,具体项目具体分析,不要为了秀操作强行cram一堆不合适的东西。
3. 执行游戏逻辑 终于到大家比较在意的动画阶段了?输出经过处理变成命令,最终可以用于驱动游戏逻辑,主要是播放角色动画,根据动画时间轴执行帧事件,调用对应的游戏逻辑 动画上主要是帧事件信息和打击信息两类,简要整理如下 3.1. 帧事件信息 动画播放到什么阶段要发生什么事情
◇有效范围 ◇位移速度 ◇持续时长 ◇曲线(可选)
◇有效范围 ◇转向角速度 ◇持续时长 ◇曲线(可选)
◇有一些游戏会在玩家攻击的时候显示/隐藏武器,很不幸我在做的游戏就是这么麻烦,不过也省去了制作不同武器的Idle pose的问题
◇开关角色 / 武器身上的碰撞盒来识别是否命中
◇关联到子弹 ◇子弹比较复杂,简要列举 ■弹道信息 - 直线,抛物线,追踪,回力标等,具体每一种弹道有相关的细节参数 ■碰撞信息 - Hit次数,穿透,闪烁相关的信息 ■特殊行为 - 创建其他子弹、AOE、Dummy、Buff等 ■伤害信息 - 与动作打击信息大体一致
◇每个Buff有具体的逻辑,不详细说了
◇消耗资源 ◇消耗值
◇拖尾开关:原本对象绑定在武器上,开启即可跟着武器画出轨迹 ◇武器动画:一些拥有变形的武器动画,本质逻辑和特效一样,也可以不当成特效另外做 ◇特效动画开关 ■创建位置 ■打断回收,有一些特效,如果攻击动作被中断则希望也能够将特效一并中断
◇动作自带的音效播放,一般帧事件只负责时机,具体表现由音效师在声音引擎里维护,略
◇目标速度 ◇多少时间内变化到目标速度
◇参数同上
◇时长
◇时长
◇时长 ◇碰撞盒:破招的碰撞盒与当前武器的碰撞盒很可能不会一致,需要另外配置
◇时长 ◇承受伤害系数
◇震屏,后面命中表现会具体一点说一下 ◇特写演出 3.2. 打击信息 主要用于伤害结算,不同的游戏有不同的结算流程,这里只说一些通用的吧 伤害相关
◇不同的Buff会在伤害流程的不同阶段生效,具体视Buff效果与伤害结算流程而定,下面简单举例 ■命中阶段,例如连续命中加伤害 ■伤害结算阶段,例如对特定护甲类型加伤害 ■After hit阶段,例如吸收造成伤害一定百分比的血量 命中表现相关
◇时间 ◇速率 ◇曲线 ◇衰减:用于控制连续命中多个目标不发生多次冻结,视需求配置
◇手K相机动画:能够稳定地控制相机的State,但是处理叠加的时候会比较困难,极端情况下震动1+震动2可能变成静止,所以一般震动会强切(毕竟相机最好只播一个动画 ◇算法模拟 ■运动方式:PedX/PedY/Dolly/Pitch/Yaw/Roll ■运动强度:强度 / 频率 / 扰动 ■可以使用统一的Intensity和衰减率来控制,便于叠加,只是优秀的扰动算法参数很多并不好维护 受击方表现相关
◇小受击:局部Additive Pose,不打断当前动作 ◇普通受击:打断当前动作,但是霸体/受击保护可以免疫 ■受击 / 击退 / 击倒 / 击飞
◇演出:投技、盾反、背刺、斩杀等,涉及到动画协同播放,相机演出和游戏逻辑的变化(比如AI停止攻击) ◇异常受击:异常伤害积累到特定值时触发,眩晕/麻痹等
◇没做过,一些游戏机制允许无限连只是要根据浮空阶段受到的伤害动态控制下落速度,感觉也会很复杂 4. 总结
最后说一句,国内还是有做动作游戏的开发组的,虽然水平未必好,但是总归是有的。 顺便帮这个组招一个关卡策划,2年以上Unity/Unreal引擎操作经验,熟悉从白盒开始的关卡制作流程,爱学习爱钻研,热爱单机动作游戏,不怕苦不怕累(流程好复杂的),坐标厦门,简历戳。 |