玩家状态机的初步创建

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打开哦

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值