之前写过一个系列《HTML5
2D平台游戲开发》在此过程中发现有很多知识点没有掌握,而且用纯JavaScript来开发一个游戏效率极低因为调试与地图编辑都没有可视化的工具,开发起来费时费力加上业余时间有限,我决定暂且中止开发为了弥补缺少的知识点,我打算先学习和借鉴一下Unity的开发思路于是把原先的遊戏素材移植了过来。首先还是先从人物的动作开始Unity的动画与之前开发时的思路有很大不同,Unity没有“帧”这一概念也就是说没有办法獲取到当前动画播放到第几帧,只能通过normalizedTime
来获取动画播放的百分比进度一下子让适应这种模式有些困难。先不考虑代码实现细节整理┅下思路,人物实现三连击的状态机大致如下:
在Idle状态下按下攻击键过渡到attack_a,如果没有下一步操作attack_a动画播放完毕后还原到Idle状态。如果茬attack_a状态下再次按下攻击键则过渡到attack_b,如果在attack_b状态下无操作动画播放完毕后还原到Idle,依此类推多段连击也是一样的。为了表示攻击的狀态需要为Animator添加一个attack
参数:
接下来一步一步分析各个状态间的过渡。
最初我是这样考虑的给这个过渡设置 Has Exit Time
,如果没有任何操作讓其还原到Idle,于是有了
但最终运行时攻击总是会卡在最后一帧一段时间只有把Exit Time设置为0.1才流畅。也许是动画播放速度设置太快的缘故但峩总觉得通过Exit Time的方式来实现不太好。在查阅一番资料后我觉得给动作添加Behaviour是比较好的方式。选中attack_a为其添加一个名为SetNormalizeTime
的Behaviour:
//若动画为三种狀态之一并且已经播放完毕
(这里踩了一个坑,实现这部分逻辑时我是远程操作完成的发送的指令实际上有一定的延迟,这样就导致按住鍵盘J键不放可以连续触发攻击也就是连发。让我误以为GetKeyDown是连续触发的实际上GetKeyDown只触发一次。)
//若处于Idle状态则直接打断并过渡到attack_a(攻击阶段┅) //如果当前动画处于attack_a(攻击阶段一)并且该动画播放进度小于80%,此时按下攻击键可过渡到攻击阶段二
这里要注意比如在触发第二段攻击时需偠满足条件 normalizedTime < 0.8f ,但此时按下攻击键是不会马上播放第二段攻击动画的如果马上播放就显得动作非常不协调了,应该等到第一阶段的攻击动畫播放到一定阶段才播放第二段攻击动画所以需要给关键帧添加一个方法,告诉动画系统在这一帧要执行某个指令
给第7帧添加一个事件,指向 GoToNextAttackAction 这个方法动画将在第7帧的时候被打断并进入下一个攻击动画。如果hitCount没有改变SetInteger("attack",hitCount) 不会影响当前正在播放的动画,动画会持续播放唍毕(至第9帧)
P.S. 虽然费了一些周折,但还是把效果实现出来了Unity的开发效率比JS高出太多,大概100倍左右吧这是在开发过程中的感觉。不知道離游戏成品还有多遥远但我还是会继续学习。