之前写过一个系列《HTML5 2D平台游戏开发》,在此过程中发现有很多知识点没有掌握,而且用纯JavaScript来开发一个游戏效率极低,因为调试与地图编辑都没有可视化的工具,开发起来费时费力,加上业余时间有限,我决定暂且中止开发。为了弥补缺少的知识点,我打算先学习和借鉴一下Unity的开发思路,于是把原先的游戏素材移植了过来。首先还是先从人物的动作开始,Unity的动画与之前开发时的思路有很大不同,Unity没有“帧”这一概念,也就是说没有办法获取到当前动画播放到第几帧,只能通过normalizedTime
来获取动画播放的百分比进度,一下子让适应这种模式有些困难。先不考虑代码实现细节,整理一下思路,人物实现三连击的状态机大致如下:
- Idle ⇢ attack_a ⇢ Idle
- Idle ⇢ attack_a ⇢ attack_b ⇢ Idle
- Idle ⇢ attack_a ⇢ attack_b ⇢ attack_c ⇢ Idle
在Idle状态下按下攻击键,过渡到attack_a,如果没有下一步操作,attack_a动画播放完毕后还原到Idle状态。如果在attack_a状态下再次按下攻击键,则过渡到attack_b,如果在attack_b状态下无操作,动画播放完毕后还原到Idle,依此类推,多段连击也是一样的。为了表示攻击的状态,需要为Animator添加一个attack
参数:
attack等于0表示处于非攻击状态,attack等于1表示处于attack_a,2和3分别表示处于attack_b、attack_c。
接下来一步一步分析各个状态间的过渡。
Idle ⇢ attack_a
Idle状态可以随时通过按下攻击键打断并过渡到attack_a,故没有 Has Exit Time
,其它项也都置为0。
attack_a ⇢ Idle
最初我是这样考虑的,给这个过渡设置 Has Exit Time
,如果没有任何操作,让其还原到Idle,于是有了
但最终运行时攻击总是会卡在最后一帧一段时间,只有把Exit Time设置为0.1才流畅。也许是动画播放速度设置太快的缘故,但我总觉得通过Exit Time的方式来实现不太好。在查阅一番资料后,我觉得给动作添加Behaviour是比较好的方式。选中attack_a,为其添加一个名为SetNormalizeTime
的Behaviour:
public class SetNormalizedTime : StateMachineBehaviour { private st