有限状态机简单实现

转载自:https://blog.csdn.net/a15354025323/article/details/80672202

namespace FSM
{
    public class State
    {
        //指明当前状态机被哪个状态机所管理
        public StateMachine stateMachine;
 
        //三种状态
        public virtual void EnterState()
        {
        }
        public virtual void UpadateState()
        {
        }
        public virtual void ExitState()
        {
        }
    }
    //吃饭状态
    public class EatState : State
    {
        public override void EnterState()
        {
            Debug.Log("饭前洗手");
        }
        public override void UpadateState()
        {
            Debug.Log("吃饭中");
            if (Input.GetKeyDown(KeyCode.A))
            {
                stateMachine.ChangeState("Study");
            }
        }
        public override void ExitState()
        {
            Debug.Log("饭后甜点");
        }
    }
    //睡觉状态
    public class SleepState : State
    {
        public override void EnterState()
        {
            Debug.Log("睡前洗漱");
        }
 
        public override void UpadateState()
        {
            Debug.Log("睡觉中zzzZZZZ");
            if (Input.GetKeyDown(KeyCode.A))
            {
                stateMachine.ChangeState("Eat");
            }
        }
        public override void ExitState()
        {
            Debug.Log("睡醒了");
 
        }
    }
    //学习状态
    public class StudyState : State
    {
        public override void EnterState()
        {
            Debug.Log("学前准备");
        }
 
        public override void UpadateState()
        {
            Debug.Log("学习中");
            if (Input.GetKeyDown(KeyCode.A))
            {
                stateMachine.ChangeState("Sleep");
            }
        }
        public override void ExitState()
        {
            Debug.Log("下班");
        }
    }
    public class StateMachine
    {
        //自定义一个key值即状态名   对应一个行为状态
        private Dictionary<string,State> _stateDic = new Dictionary<string, State>();
        private State _currentState;
 
 
        //注册   对应新动画系统中  把动画剪辑拖入到窗口中
        public void Register(string key, State state)
        {
            state.stateMachine = this;
            _stateDic.Add(key, state);
        }
        //设置默认  对应新动画系统中 右键选择起始状态
        public void SetDefault(string stateName)
        {
 
            if (_stateDic.ContainsKey(stateName))
            {
                _currentState = _stateDic[stateName];
                _currentState.EnterState();
            }
        }
        //改变  对应新动画系统中  状态之间的连线  处理状态之间的切换
        public void ChangeState(string stateName)
        {
            if (_currentState != null)
            {
                _currentState.ExitState();
            }
            if (_stateDic.ContainsKey(stateName))
            {
                _currentState = _stateDic[stateName];
                _currentState.EnterState();
            }
        }
        //状态机执行
        public void DoWork()
        {
            if (_currentState != null) 
            {
                _currentState.UpadateState();
            }
        }
    }
}
状态机的添加和调用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FSM;
 
public class TestFSM : MonoBehaviour {
 
    StateMachine stateMachine;
 
    // Use this for initialization
    void Start () {
        stateMachine = new StateMachine();
        stateMachine.Register("Sleep", new FSM.SleepState());
        stateMachine.Register("Eat", new FSM.EatState());
        stateMachine.Register("Study", new FSM.StudyState());
        stateMachine.SetDefault("Sleep");
 
    }
    
    // Update is called once per frame
    void Update () {
        stateMachine.DoWork();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值