有了待机状态的结构铺垫,移动状态的实现就很简单了,本身角色移动的逻辑就几行代码。
在角色待机状态时,如果检测到玩家输入,则切换到行走状态,这里注意,重写的Update是通过框架底层的托管服务使得灭有继承Mono的状态类也可以用类似Update的生命周期函数来检测输入。
public class Player_IdleState : PlayerStateBase
{
public override void Enter()
{
//播放待机动作
player.PlayAnimation("Idle");
}
public override void Update()
{
//检测玩家的输入
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
if (h!=0 || v!=0)
{
//切换状态
player.ChangeState(PlayerState.Move);
}
}
}
对应完善PlayerController中的切换逻辑。
public void ChangeState(PlayerState playerState)
{
this.playerState = playerState;
switch (playerState)
{
case PlayerState.Idle:
stateMachine.ChangeState<Player_IdleState>((int)PlayerState.Idle);
break;
case PlayerState.Move:
stateMachine.ChangeState<Player_MoveState>((int)PlayerState.Move);
break;
default:
break;
}
}
新建Player_MoveState状态类,在进入状态时播放移动动画,当玩家输入为0时,切换回待机状态。
public class Player_MoveState : PlayerStateBase
{
public override void Enter()
{
//播放待机动作
player.PlayAnimation("Walk");
}
public override void Update()
{
//检测玩家的输入
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
if (h == 0 && v == 0)
{
//切换状态
player.ChangeState(PlayerState.Idle);
}
else
{
//处理移动
//处理旋转
}
}
}
播放动画的逻辑在PlayerController中已经结合配置文件进行了实现,只需要项配置SO中添加动画Clip。
/// <summary>
/// 播放动画
/// </summary>
public void PlayAnimation(string animationClipName,float fixedTime = 0.25f)
{
view.Animation.PlayAnimation(warriorConfig.GetAnimationByName(animationClipName),fixedTime);
}
最终效果,按下WASD播放角色移动动画,松开恢复待机动画。