Unity引擎2D游戏开发,三段攻击动画的实现

发布时间 2023-12-20 14:17:42作者: 心霖の雨

新建三段动画的Animation

将Project中的三段攻击动画的素材,拖入到Animation窗口,分别命名为BlueAttack1,BlueAttack2,BlueAttack3
image

在Animator中创建动画图层并进行进一步的操作

创建新的动画图层,命名为Attack Layer
image

在窗口中创建新的State,作为默认上一层的state入口
image

将之前创建好的三段动画拖入Animator窗口中
image

在这三段攻击,每一段的攻击都是相互独立的,都是可以在每一段攻击完成之后进行打断。前一个攻击动画播放完毕后,再次按下攻击键才会进行下一段的攻击。因此,可以通过combo数是否满足是否超过来进行判断一段攻击是否完成。

创建一个新的变量isAttack
image

将New State与BlueAttack1连线,并添加isAttack的条件,在上方调整好相关参数
image

左侧再创建一个新的Trigger,命名为attack。当Trigger触发时,才进行攻击。
image

在连线中,添加Trigger条件
image

新建combo变量
image

将combo变量添加进Attack1的连线中
image

并且将上面Attack2、Attack3分别连接起来,将3个动画进入条件都添加进去
image

image

接着将Attack2Attack3的动画参数调整好
image

image

Exit Time之所以设置为0.9(90%),是因为当前动画播放了90%之后进行了按键输入,则进入下一个阶段的动画

分别将三段动画与Exit连线
image

将三段连线皆设置为以下参数
image

即一个阶段播放完毕没有进行按键的输入,则退出动画不进入下一个阶段

添加攻击的触发按键

打开InputSystem文件夹,打开PlayerInputControl输入控制系统
image

在输入控制系统内添加新的Action,并命名为Attack
image

选择新创建的Action,右侧Path内,点击Listen,绑定J键
image

勾选KeyBoard&Mouse
image

手柄同理,绑定一个按键即可
image

三段攻击的C#代码逻辑

打开PlayerController,在Awake()方法内,将按键绑定攻击的方法,攻击的方法命名为PlayerAttack()

//攻击
playerInputControl.Gameplay.Attack.started += PlayerAttack;

在PlayerAnimation中,添加Trigger的set方法

public void PlayerAttack()
{
    animator.SetTrigger("attack");
}

在PlayerController中,因为要按键触发动画,所以在此获取PlayerAnimation组件。先添加全局变量。

private PlayerAnimation playerAnimation;

在PlayerController的Awake()内,获取PlayerAnimation组件

playerAnimation = GetComponent<PlayerAnimation>();

在PlayerController的PlayerAttack()内,因为攻击动画需要对是否攻击的状态和攻击combo数进行判断。所以新建两个全局变量isAttack和combo

public bool isAttack;
public int combo;

PlayerAttack()方法内,设置isAttack为true,并且增加combo数,到达一定阈值进行归0

playerAnimation.PlayerAttack();
isAttack = true;
combo++;
if (combo >= 3)
{
    combo = 0;
}

接着,将PlayerController中的两个变量传入到PlayerAnimation中进行set

animator.SetBool("isAttack", playerController.isAttack);
animator.SetInteger("combo", playerController.combo);

此时进行Play,能够发现,combo数值变化很快,最高数值为2,人物并没有进行下一阶段的动画。

解决无法进入下一阶段动画的问题

不需要combo参数,将combo参数从Animator窗口中删除,并将所有连线绑定的combo参数删除
image

image

将combo判断从代码中删除
image

image

解决三段攻击完成后额外进行了一次攻击

动画完成之后,没有将isAttack参数设置为False

在Animatior窗口中,选中动画,在右侧点击Add Behavior,创建攻击动画完成脚本,命名为AttackFinish
image

在OnStateExit()方法中,将PlayerController中的isAttack参数设置为False

override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    animator.GetComponent<PlayerController>().isAttack = false;
}

在Attack2和Attack3中,都绑定此代码
image

image