1、脚本文件的创建
首先我们创建4个脚本文件,分别为命名为Player,PlayerState,PlayerStateMachine,PlayerIdleState,PlayerMoveState。其次只让Player继承MonoBehaviour,让PlayerIdleState,PlayerMoveState继承PlayerState。
2、书写脚本
1、对于PlayerState脚本书写如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerState
{
protected PlayerStateMachine playerStateMachine;
protected Player player;
private string animBoolName;
public PlayerState(Player _player , PlayerStateMachine _playerStateMachine,string _animBoolName)
{
this.playerStateMachine = _playerStateMachine;
this.player = _player;
this.animBoolName = _animBoolName;
}
public virtual void Enter()
{
Debug.Log("进入了:" + animBoolName);
}
public virtual void Update()
{
Debug.Log("正在:" + animBoolName+"状态");
}
public virtual void Exit()
{
Debug.Log("退出:" + animBoolName + "状态");
}
}
PlayerState有三个属性,Player、PlayerStateMachine、animBoolName,一个构造函数、三个函数分别为Enter()进入什么状态、Update()处于什么状态、Exit()退出什么状态。
2、PlayerStateMachine书写
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(PlayerState _newState)
{
currentState.Exit();
currentState= _newState;
currentState.Enter();
}
}
PlayerStateMachine主要负责初始化状态和状态的切换。
3、PlayerIdleState书写
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerIdleState : PlayerState
{
public PlayerIdleState(Player _player, PlayerStateMachine _playerStateMachine, string _animBoolName) : base(_player, _playerStateMachine, _animBoolName)
{
}
public override void Enter()
{
base.Enter();
}
public override void Exit()
{
base.Exit();
}
public override void Update()
{
base.Update();
}
}
因为PlayerIdleState继承PlayerState所以我们要把构造函数补齐,然后复写三个方法即可,同理PlayerMoveState也是这样。
4、Player脚本的书写
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
public class Player : MonoBehaviour
{
public PlayerStateMachine stateMachine { get; private set; }
public PlayerIdleState stateIdle { get; private set; }
public PlayerMoveState moveState { get; private set; }
private void Awake()
{
stateMachine = new PlayerStateMachine();
stateIdle = new PlayerIdleState(this, stateMachine, "Idle");
moveState = new PlayerMoveState(this, stateMachine, "Move");
}
private void Start()
{
stateMachine.Initialize(stateIdle);
}
private void Update()
{
stateMachine.currentState.Update();
}
}
Player脚本定义 stateMachine、stateIdle、moveState并在Awake()函数里赋值给他们。我们在Start函数先初始化stateIdle,在Update()函数里调用当前状态的Update就搭建好一个简易的状态机啦。
3、运行效果
在场景创建一个Empty,名为Player,并把之前书写好的Player脚本绑定到上面。运行程序就能得到以下效果啦!
如果没有记得把Console打开哦