今天上b站,看到了up主NowPaper老师关于Unity连招的思路,觉得代码写得很简洁、同时实现了预输入,觉得很有借鉴意义。
思路介绍
NowPaper老师整体的思路是,先声明InputType来存储输入类型,InputType == 1为轻击输入、InputType == 2为重击输入,结合InputSystem来判断输入类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| //声明两个数组来存储轻击和重击动画 //这点我觉得其实鬼鬼鬼ii做的简单技能编辑器效果要更好,关于技能编辑器参考我的文章“Unity基础连招思路” public AnimationClip[] Attack1Clips; public AnimationClip[] Attack2Clips; ...... //以下是根据InputSystem配置好的,判断攻击类型的。 int InputType = 0; void OnFire1(InputType value) { if(value.isPressed) { InputType = 1; } }
void OnFire2(InputType value) { if(value.isPressed) { InputType = 2; } } ...... //声明当前招式索引,默认为0 public int currentAttack = 0; //声明输入失效时间 float _outTimer = 0;
private void PlayAttack(int index, int type) { // 开始攻击的时候,让移动失效,这句代码也是事先写好的 _move.enabled = false; AnimationClip clip; if (type == 1) { // 如果是轻攻击,则播放并连招数+1 clip = Attack1Clips[index]; currentAttack++; } else { // 如果是重攻击,则播放并连招数=0 clip = Attack2Clips[index]; currentAttack = 0; } // 播放动画 _animator.CrossFade(clip.name,0.2f); //记录动画时间 _outTimer = clip.Length; }
......
void Update() { // 计算失效时间 _outTimer -= Time.deltaTime; if (_outTimer <= 0) { // 如果失效,则激活移动,并连招数归0 _move.enabled = true; currentAttack = 0; } if (inputType != 0) { // 如果在动画结束前0.4秒内,检测输入则播放对应的动画 //currentAttack < Attack1Clips.Length这点很妙,如果索引超过了就不让你再攻击了,连招打完直接重置 if (_outTimer <= 0.4f && currentAttack < Attack1Clips.Length) { PlayAttack(currentAttack, inputType); } } // 重置inputType,以便下一次输入 inputType = 0; }
|