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);
}
}
}