有了待机状态的结构铺垫,移动状态的实现就很简单了,本身角色移动的逻辑就几行代码。

在角色待机状态时,如果检测到玩家输入,则切换到行走状态,这里注意,重写的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);
    }

alt

最终效果,按下WASD播放角色移动动画,松开恢复待机动画。

alt