五分钟详述:一文理解动作游戏开发中的攻击逻辑和受击逻辑

131 阅读3分钟

###前言: 本文节选自机械工业出版社出版的《Unity3D动作游戏开发实战》一书,略有改动。经出版社授权刊登于此。

攻击逻辑

一个好的操作手感对于战斗非常重要,玩家会根据当前动画状态来确定下一步输入,若手感混乱则会对玩家造成不适。通常,格斗游戏会有一套帧数表供玩家参考,虽然我们不一定要像格斗游戏那样制作帧数表,但也可以依据动画剪辑进行简单地拆分。

首先根据剪辑内容将动画范围分为输入帧与混合帧部分,若输入帧内没有输入正确指令则不会完成连续技的跳转,当动画到了混合帧后就开始下一个剪辑的混合,并且在混合帧上是不能放置动画事件的,如图1所示,中间部分为输入帧,末尾为混合帧。

                           图1   输入帧与混合帧

Unity的Mecanim动画系统并不能很好地实现这个机制,读者可以借助Playable或者直接获取动画片段等方式进行扩展。

下面的脚本部分将示范攻击范围矫正及攻击对象的创建等。首先需要建立一个类Attacker,它附带了各种各样的攻击信息,一般挂载于预制体(Prefab)上,并最终绑定在碰撞器上随技能、普攻中的动画事件触发。

public class Attacker : MonoBehaviour

然后处理主角的攻击逻辑,首先是一些变量定义的初始化:

public class TestAttack : MonoBehaviour

缓存数组是因为后面会做攻击方向矫正,其他用到的变量和前面类似。我们来看一下攻击方向矫正的代码:

Transform GetClosestEnemy(float radius,float dotLimit)

其中,第一个参数是半径,第二个参数是点乘约束值。调用GetClosestEnemy函数后会通过Layer与标签过滤得到需要矫正的敌人并返回,最后在Update中将其整合。

void Update()

由动画触发动画事件再触发挂载Attacker的预制体,即可产生攻击判定并使敌人遭受伤害。

 受击逻辑

受击处理是一个非常能体现打击感的部分,受击的动画一般分为三个处理部分,即“受击前—受击—受击结束”。但这样常规的剪辑动画并不能满足动作游戏快节奏的需要,所以动画会被拆解成只有“受击—受击结束”两部分来处理,如图2所示。

                           图2    受击动画裁剪示意

另外,受击中还需考虑僵直及顿帧处理,具体先看代码:

public class TestHit : MonoBehaviour

和攻击一样,用了Attacker这个对象,僵直信息会在Update中更新,顿帧可以直接停顿全局时间,也可以停顿单个物理的动画。这里采用了停顿动画的方式,首先将受击动画绑定了一个Animator变量作为系数,然后在顿帧触发后进行更新。