Unity引擎2D游戏开发,三段攻击动画的实现
新建三段动画的Animation
将Project中的三段攻击动画的素材,拖入到Animation
窗口,分别命名为BlueAttack1,BlueAttack2,BlueAttack3
在Animator中创建动画图层并进行进一步的操作
创建新的动画图层,命名为Attack Layer
在窗口中创建新的State
,作为默认上一层的state入口
将之前创建好的三段动画拖入Animator
窗口中
在这三段攻击,每一段的攻击都是相互独立的,都是可以在每一段攻击完成之后进行打断。前一个攻击动画播放完毕后,再次按下攻击键才会进行下一段的攻击。因此,可以通过combo数是否满足是否超过来进行判断一段攻击是否完成。
创建一个新的变量isAttack
将New State与BlueAttack1连线,并添加isAttack
的条件,在上方调整好相关参数
左侧再创建一个新的Trigger
,命名为attack。当Trigger触发时,才进行攻击。
在连线中,添加Trigger
条件
新建combo
变量
将combo变量添加进Attack1
的连线中
并且将上面Attack2、Attack3
分别连接起来,将3个动画进入条件都添加进去
接着将Attack2
和Attack3
的动画参数调整好
Exit Time之所以设置为0.9(90%),是因为当前动画播放了90%之后进行了按键输入,则进入下一个阶段的动画
分别将三段动画与Exit
连线
将三段连线皆设置为以下参数
即一个阶段播放完毕没有进行按键的输入,则退出动画不进入下一个阶段
添加攻击的触发按键
打开InputSystem文件夹,打开PlayerInputControl
输入控制系统
在输入控制系统内添加新的Action
,并命名为Attack
选择新创建的Action,右侧Path内,点击Listen
,绑定J键
勾选KeyBoard&Mouse
手柄同理,绑定一个按键即可
三段攻击的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参数删除
将combo
判断从代码中删除
解决三段攻击完成后额外进行了一次攻击
动画完成之后,没有将isAttack参数设置为False
在Animatior窗口中,选中动画,在右侧点击Add Behavior
,创建攻击动画完成脚本,命名为AttackFinish
在OnStateExit()方法中,将PlayerController中的isAttack
参数设置为False
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.GetComponent<PlayerController>().isAttack = false;
}
在Attack2和Attack3中,都绑定此代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!