前言
因为具体动作实现繁琐,且均是在同一套状态机代码框架内实现的,所以本文重点记录其框架
状态框架的实现:
第一步:
将不同状态分别用枚举类型表出对其进行封装
public enum WeaponState
{
idle,
shoot,
reload,
shove,
telescope
}
private WeaponState weaponState; //对枚举状态进行封装
public WeaponState WeaponState
{
get => weaponState;
set
{
weaponState = value;
switch (weaponState)
{
case WeaponState.idle:
animator.SetBool("shoot", false);
animator.SetBool("reload", false);
animator.SetBool("shove", false);
break;
case WeaponState.shoot:
break;
case WeaponState.reload:
animator.SetBool("shoot", true);
break;
case WeaponState.shove:
break;
case WeaponState.telescope
break;
}
}
}
在set中用switch来判断当weaponState变化时,如切换到换弹(reload)状态则播放该动画。注意该操作只在状态改变时执行一次
第二步:
再用一组相同的switch-case语句放入update中对当前的状态进行每一帧的监听,如处于idle状态则需检测是否有鼠标右键输入(开火键),如有则切换为开火状态…
Update()
{
switch (weaponState)
{
case WeaponState.idle:
if (Input.GetMouseButton(0))
{
WeaponState = WeaponState.shoot;
Shoot();
}
break;
case WeaponState.shoot:
break;
case WeaponState.reload:
break;
case WeaponState.shove:
break;
case WeaponState.telescope
break;
}
}
而在开火状态(shoot),则需判断是否需要保持,或切换状态等等。
在这种状态处理上可实现监听,和连续调用。
总结
第一个switch-case语句中因放在set里,所以适合实现状态切换时只执行一次动作,如装弹和开镜的动画等。
第二个switch-case放在update中负责实现监听和连续调用,如监听状态改变的条件,连续开枪的动作等。