作者:无404
https://zhuanlan.zhihu.com/p/2054680285145477443
概述
之前写过一篇关于动作游戏震屏设计实践的文章,今天想顺着那个话题继续记录一下对打击感的总结,网上已经有很多关于打击感表现差异的视频了,这里我就只做单纯的文字记录。
如果从模块拆解来看,打击感通常可以分为攻击、命中和受击反馈几个部分。动画、特效、音效、震屏、顿帧、击退都可以归到这条链路里,只是大家讨论时往往会更集中在顿帧和震屏上。个人理解打击感在于攻击的力度有没有通过攻击-命中-反馈的链路传达出来。
打击感的设计:打击感是在做可信的力量传递
我个人项目和过往主导的项目是写实风格为主,在部分非写实风格游戏中可以把反馈做得很满,特效铺开,镜头大幅震动,伤害跳字等等,玩家也比较容易接受。但偏写实项目里,这些反馈一旦过量,就很容易出戏。所以偏写实项目的打击感更看重力度是否可信,攻击动作本身要先让玩家感到这一击有发力过程,命中时再通过顿帧、音效、受击、血液、镜头把这份力度传出来。让玩家相信不只是“我打中了”,而是“我的这一击带着合适的力量打中了”。
刀光是攻击力度和轨迹的补充
在近战中,刀光很容易被当成特效包装,但我更愿意理解为攻击信息。第三人称战斗里,玩家很多时候并不是精确看清武器模型,而是通过特效来理解攻击方向和范围。镜头角度、敌人遮挡、场景背景、角色动作都会影响信息的获取。刀光的作用,就是帮玩家更快理解这次攻击的方向、范围,以及动作的发力路径。在个人项目中,刀光不能脱离武器自己表演。横斩要顺着横向切过去,下劈要把向下压的方向表现出来,突刺要把力收在前向,并不是为了好看而铺出一大片弧形刀光。我一般会把刀光看成对武器发力轨迹的强调。它可以让动作理解更清楚,也可以让力度传递更容易被看见,但不能替代动作本身。
命中瞬间要把力度打出来
打击感关键的地方往往就在命中那一下。动作发力最明确的 Pose 帧、音效、特效、受击动画、顿帧和震屏,都要围绕命中点发生。我以前调试这部分时,主要是看命中帧;看攻击到底在哪一帧把力度打出去,命中后还保留了多少后续 Pose。再慢动作看敌人什么时候开始受击,看声音和血液有没有提前或者滞后。很多时候只是差了几帧,但实机手感会差很多。偏写实项目尤其吃这个。因为它不像夸张风格那样可以用大量反馈(尤其特效)盖过去,一旦力度没有在命中点上成立,玩家会很快感觉出来。
顿帧是力度命中目标后的阻力
顿帧也就是通俗意义上的“卡肉”,但我更倾向于把它理解成攻击命中阻力。攻击命中目标时,不应该像划过空气一样顺滑。命中瞬间稍微停住一点,玩家会感觉目标承受了这一击的力度,攻击和受击之间产生了真实接触。所以顿帧不是单纯表现“命中了”,它更像是在表现攻击作用力和目标反作用力之间的短暂对抗。轻攻击的力度小,顿帧相对短甚至没有;重攻击的发力更强,顿帧可以更明显;破防这类表现,顿帧可以把力度表现的更明确一些。我一般以 60 帧为基准来配置顿帧。近战常用范围大概在 1 到 6 帧左右,远程不加顿帧或者控制在 2 帧以内。这个不是绝对标准,只是经验上比较舒服的区间。轻攻击给太长会导致过强的停顿感,重攻击完全没有停顿又会轻飘。
此外,这里要结合武器、动作力度和敌人体型一起看。短刀、匕首这类武器攻击,单次发力通常更短促,顿帧可以几乎没有,否则连续攻击的流畅性会大幅下降。长刀、剑、长柄武器有更明显的挥砍发力过程,命中停顿可以稍微清晰一些,大概在 0-2 帧左右。锤、斧、大剑这类重武器更具有重量和冲击,玩家本身也会期待更强的阻力感,但也不能每次攻击都拉满,否则动作会被顿帧切成一段一段,导致视觉卡顿。有趣的是,拳脚类通常顿帧和攻击 Pose 帧会相较其他武器更加明确,通常在 3 帧左右,以凸显拳拳到肉的感受。顿帧恰到好处,可以强化视觉冲击。过长的顿帧,只会让玩家觉得动作不流畅,甚至像卡顿。
震屏是力度的扩散
震屏我之前已经单独写过【动作游戏震屏设计的个人实践与经验总结】
这里只放在打击感链路里简单说一下。普通攻击可以有很轻的镜头反馈,但明显震屏最好留给重击、破防、处决、关键命中这类节点。多段攻击尤其要克制,连续震屏会让画面变碎,玩家也会疲劳。
受击要反馈攻击的力度
玩家命中了敌人,敌人必须要有受击反馈。我比较常用的做法是把受击拆成叠加受击和硬直受击。
叠加受击适合不能打断怪物行为的情况。比如怪物正在攻击,或者 Boss 正在播放用于体现压迫感的关键动作,这时就不适合直接进入完整受击,但可以通过动画叠加一些命中反馈。这样既不破坏怪物行为,也不会让玩家觉得自己没有打中。硬直受击则用在真正需要打断行为的时候。小怪被重击命中、削韧成功、破防、特殊技能命中,都可以进入更完整的受击状态。
大型怪物通常进行局部受击的处理,常见做法是通过骨骼抖动、材质反馈来处理,也可以根据项目需求加入断肢、部位破坏等表现。
击退是表现力度造成的空间结果
击退可以表现力量,但也很容易破坏战斗。击退会增强命中爽感,但敌人被推得太远,玩家连段接不上;位移方向不对,命中会变假;动画脚下没配合,还会出现明显滑步。个人项目经历里,击退要和重量感绑定。普通小怪可以被推得更明显,精英怪要收一些,大型怪物更多靠局部反馈,Boss 的大位移最好留给破防、处决或者阶段转换。
击退要让玩家觉得这次攻击的力度在空间上产生了合理结果,更精细一些的做法可以通过受击击退的距离来控制整体战斗在战场上的位置,以确保不会一直在关卡边缘战斗。
特效和音效也很关键
在过往偏写实项目通常不使用伤害跳字。这样增强了沉浸感,但一定程度上影响了玩家对命中结果的直观理解。
这时特效(尤其是血液飞溅特效)和音效就要承担更多信息。血液不仅仅表现“受击流血”,它还要让玩家理解命中位置、攻击方向和大概强度。轻攻击可以控制得很小,重攻击可以有更明确的方向性,破防和处决再用更强的表现。但是血效一旦过量,画面会很杂乱,群体战斗里尤其明显。
音效的重要性更高。很多时候玩家更依赖听觉来理解攻击的命中。命中音效极大的提高了打击感的强度和攻击的可信度。在偏写实项目里,挥刀声、命中肉体、命中护甲、格挡、破防、敌人受击声都需要有层次。音效并不是最后补上的包装,而是打击感本身非常重要的一部分。

打击感的实现:将力度进行切实落地
实现上,我不太倾向把所有反馈都写死在技能里。技能里直接塞判定、顿帧、震屏、受击、击退、特效和音效,前期验证确实快,但后期会越来越难改,模块之间也会越来越耦合。武器类型变多、怪物体型变多、受击状态变复杂以后,每个技能都会塞很多分支。
我更倾向于将攻击命中当作一次事件。技能负责产生命中结果,反馈系统根据结果去决定怎么表现。这样反馈可以复用。
精准判定要考虑低帧率
偏写实近战一般会更依赖精准判定。武器上挂 Socket,或者用 Box、Capsule 跟随武器,在动画通知里开启有效判定窗口。这样玩家看到武器砍到哪里,逻辑上也尽量在那里命中。
但低帧率下很容易漏判。只检测当前帧位置时,武器可能上一帧还在目标一侧,下一帧已经穿过去了,中间没有被检测到。玩家视觉上看到砍中了,逻辑上却没有命中,这种问题非常影响战斗表现。所以判定需要做连续检测。上一帧 Socket 到当前帧 Socket 之间做 Swept Trace,武器较长时可以增加多个采样点。这样既能让判定贴近武器,又能减少低帧率下未命中的问题。
精准判定也不完全等于完全贴模型。动作游戏需要容错,尤其是第三人称视角下,视觉感受比数学精度更重要。
判定有时会放到攻击 Pose 后
有些攻击我会让判定比攻击 Pose 稍微晚 1 到 2 帧。
这个处理看起来有点反直觉,但在某些攻击里,反而能增强“打中了”的感受。玩家感受到实打实命中的时刻,不一定是武器刚接触受击框的那一帧,而可能是角色发力 Pose 更完整的那一帧。
如果判定开得太早,命中顿帧会发生在武器尚未真正贴近骨骼网格体的时候,玩家看到的印象画面就会变成“还没砍到就停住了”。所以部分攻击可以把判定略微压后,让命中反馈更贴近视觉感受。
当然这件事不能套用到所有攻击,通常重武器和强攻击更适合这样处理。最后还是要进实机,看实机受击表现是否准确。
命中结果要带足够信息
命中反馈要分层细致,命中结果传递的信息就不能单一。在项目中,通常命中结果至少要记录攻击来源、命中位置、攻击类型、攻击强度。在这些信息和双方的状态决定后面的表现。在 UE 中,如果使用 GAS,可以通过 GE 或 GameplayEvent 传递双方信息,通过攻击定义配置本次攻击的基础数据,再由中间层处理出更抽象的命中结果,例如普通受击、破防、格挡等。之后再结合命中结果、GameplayTag 和双方状态,决定具体表现以及额外数值计算。
UE 中顿帧的实现方式
UE 里做顿帧,可以使用 CustomTimeDilation 和修改动画的 PlayRate 进行实现。我个人而言更喜欢使用时停的方式。命中瞬间将攻击方和受击方的 CustomTimeDilation 降到接近 0,或者根据项目需求直接设为 0,再通过游戏时间恢复为 1。双方都短暂停一下,玩家更容易感受到动作力度和目标之间的阻力。这个方式要特别注意恢复。技能取消、角色死亡、目标销毁、状态中断,都要保证时间倍率恢复,否则很容易留下 Actor 慢动作残留或者时序问题。
动画的 PlayRate 也能做类似效果。比如只想让某个受击动画在命中点附近慢一下,不想影响整个 Actor。但 PlayRate 容易导致特效、音效错位,所以不能只改动画速度,其他时序也要一起看。我自己的倾向是,普通命中走统一时停,特殊情况再用 PlayRate 。
顿帧用帧数配置更适合策划调参
对于配置而言,顿帧我通常会配置在攻击动作的 HitFrame 上。我个人更喜欢配置成帧数,而不是秒。
0.033 秒、0.05 秒、0.066 秒这些数字不够直观。换成 1 帧、2 帧、3 帧,调参时更直观。通常而言以 60 帧为基准,实现时再转换成秒,这里要避免整数除法。如果写成 HitStopFrame / 60,并且两边都是整数,1 到 6 帧都会算成 0。用浮点数计算更稳。用 60 帧做配置基准,不代表游戏只能按 60 帧运行。通常只是让策划配置更接近动作设计习惯。
受击动画的处理
受击动画在实现上拆成两条线会更加清晰。叠加受击和局部受击不打断当前行为,只在局部加反馈。Boss、大型怪物、霸体状态、攻击中受击,都适合走这条线。UE 中通常可以使用 Additive 动画实现叠加受击,通过 Additive Montage Slot 配合 Additive 动画资源来处理。这里需要注意,叠加受击一般不应该开启 Root Motion,否则容易产生不期望的位移表现。而局部受击可以通过分层的叠加动画或者物理的骨骼抖动实现,这里不进行赘述,网上教程很多。硬直受击则会真正切入受击状态,并打断当前行为。小怪、重攻击、破防、削韧成功,可以走这条线。通常直接播全身蒙太奇即可。这样就不用在“完全打断”和“完全没反应”之间二选一。怪物行为可以保留,玩家命中也能得到期望的反馈。
此外,在配置和动画沟通上,我通常会把受击动画蒙太奇的混入时间调为 0,并要求动画起始帧有明确的形变 Pose。以强化动作突变带来的视觉冲击和印象。部分非写实项目中,甚至会把起始帧处理成更夸张的反弓 Pose,用来放大受击瞬间的视觉冲击。
程序化击退和动画根运动
击退位移我一般分成程序化和动画根运动两类。
程序化击退更灵活。命中后根据攻击方向和角色位置计算出方向,再用曲线驱动位移。曲线最好不要做成匀速平移,而是表现受力后的释放和衰减。前段力度释放更集中,中后段逐渐缓下来,末端再做缓冲停住,这样更像一次受击后的移动。它的问题是容易滑步。动画脚下没有配合时,敌人会像被平移走。轻量受击里这个问题通常还能接受,但高价值受击最好还是交给动画根运动处理。UE 中通常可以配合 GA 的 Apply Root Motion Source 相关节点实现。具体使用哪一种节点可以根据项目需求调整,本质上是通过 Root Motion Source 向角色移动组件施加一段受控位移。
动画根运动更适合强表现。重受击、击倒、破防、处决前硬直这类动作,需要脚步、重心和位移都对上,根运动会更稳,也更少滑步。需要策划和动画师沟通好实际动作的位移和节奏。我一般不会只用其中一种。通用反馈用程序化提高可配置的区间,高价值反馈用动画驱动,通过攻击定义的配置决定是否使用程序化根运动。
攻击反馈强度统一管理
一次攻击从命中到反馈,攻击强度和表现强度最好保持一致。项目里通常会用硬直值、韧性值或者反馈等级来判断目标是否进入硬直,不同类型、不同体型的怪物也应该有不同参数。这样可以避免所有敌人使用同一套受击逻辑,也能更好地控制怪物的重量感和压迫感。
另外,一些通用反馈可以通过上下文信息解耦,例如武器类型、目标体型、命中方向、当前状态等。这样不需要每个技能都单独配置一整套反馈,也能提高受击反馈的配置效率。
总结
动作游戏打击感最终还是回到一个很朴素的问题:我这次攻击命中后是什么样的力度?以上便是我个人基于项目经历对打击感的理解,欢迎大家一起讨论,如有理解不够或理解错误的地方欢迎批评指正。
登录 后参与讨论
暂无评论,来抢沙发









