玩家状态机

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    public PlayerStateMachine playerStateMachine { get; private set; }
    public PlayerIdleState playerIdleState { get; private set; }
    public PlayerMoveState playerMoveState { get; private set; }

    private void Awake()
    {
        playerStateMachine = new PlayerStateMachine();
        playerIdleState = new PlayerIdleState(playerStateMachine, this, "Idle");
        playerMoveState = new PlayerMoveState(playerStateMachine, this, "Move");

    }

    private void Start()
    {
        playerStateMachine.Initialize(playerIdleState);

    }

    private void Update()
    {
        playerStateMachine.currentState.Update();
    }
}

PlayerState.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerState
{
    //状态机、玩家、动画名
    protected PlayerStateMachine playerStateMachine;
    protected Player player;

    private string _animBoolName;

    public PlayerState(PlayerStateMachine playerStateMachine, Player player, string animBoolName)
    {
        this.playerStateMachine = playerStateMachine;
        this.player = player;
        _animBoolName = animBoolName;
    }

    //方便不同时间点调用函数
    public virtual void Enter()
    {
        Debug.Log("I enter"+_animBoolName);
    }
    public virtual void Update()
    {
        Debug.Log("I'm in " + _animBoolName);

    }

    public virtual void Exit() 
    {
        Debug.Log("Exit");
    }
}

PlayerStateMachine.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerStateMachine
{
    //当前状态
    public PlayerState currentState { get; private set; }

    public void Initialize(PlayerState startState)
    {
        currentState = startState;
        currentState.Enter();
    }

    public void ChangeState(Player player, PlayerState newState)
    {
        currentState.Exit();
        currentState = newState;
        currentState.Enter();
    }
}

PlayerMoveState.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMoveState : PlayerState
{
    //初始化列表
    public PlayerMoveState(PlayerStateMachine _playerStateMachine, Player _player, string _animBoolName) : base(_playerStateMachine, _player, _animBoolName)
    { 

    }

    //重写
    public override void Enter()
    {
        base.Enter();
    }

    public override void Exit()
    {
        base.Exit();
    }

    //V键改状态
    public override void Update()
    {
        base.Update();
        if (Input.GetKeyDown(KeyCode.V))
        {
            player.playerStateMachine.ChangeState(player,player.playerIdleState);
        }

    }
}

PlayerIdleState.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerIdleState : PlayerState
{
    public PlayerIdleState(PlayerStateMachine _playerStateMachine, Player _player, string _animBoolName) : base(_playerStateMachine, _player, _animBoolName)
    {

    }

    public override void Enter()
    {
        base.Enter();
    }

    public override void Exit()
    {
        base.Exit();
    }

    public override void Update()
    {
        base.Update();
        if (Input.GetKeyDown(KeyCode.V))
        {
            player.playerStateMachine.ChangeState(player, player.playerMoveState);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值