欢迎加入Unity业内qq交流群:956187480
qq扫描二维码加群


在实际开发中很多时候对某类别的对象都需要有多种状态的管理和切换,这个时候我们就可以引入FMS状态机概念,有限状态机主要有三要素:状态的切换跳转,状态跳转的判断,以及在具体某状态下的行为执行,下面就带着大家来制作一个简易状态机。

1.定义状态接口

这个接口里面定义一些接口方法成员,主要是让其具体的状态子类继承并实现这些方法,这里我们定义了Enter进入某状态,执行某状态,重置某状态,退出某状态;这些方法是可以自定义的没有固定格式,甚至只定义一个enter进入也可以,具体实现还是要在具体状态类里面实现

public interface IState{void Enter();void Excute();void Reset();void Exit();
}

2.创建状态基类BaseState

BaseState是各种状态的基类,实现Istate的所有接口成员方法

IState {  public BaseState( ){}public virtual void Enter(){}public virtual void Excute(){}public virtual void Exit(){}public virtual void Reset(){}
}

3.创建各种具体的状态类

比如AttackState

public class AttackState : BaseState {public override void Enter(){base.Enter();Debug.Log("进入攻击模式......");}public override void Excute(){base.Excute();Debug.Log("执行攻击模式......");}public override void Exit(){base.Exit();Debug.Log("退出攻击模式......");}

4.创建状态管理器

管理器主要作用就是管理和切换状态

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateType : MonoBehaviour
{//初始public const int DEFULT = 0;//待机public const int IDLE = 1;//移动public const int MOVE = 2;//跑开public const int RUNAWAY = 3;//攻击public const int ATTACK = 4;
}
public delegate void CallBack();public class StateManager : BaseManager<StateManager> {public IState _currentState;public int _currentStateType;protected Dictionary<int,IState> _statePool;protected override void Awake(){base.Awake();_statePool = new Dictionary<int, IState>();ChangeState(StateType.IDLE);}protected override void Update(){base.Update();if (Input.GetKeyDown(KeyCode.C)){if (_currentStateType + 1>4){_currentStateType = 0;}ChangeState(_currentStateType+1);}}public virtual void ChangeState(int stateType, CallBack callBack=null){if (_currentState != null){if (_currentStateType == stateType){_currentState.Reset();return;}else{_currentState.Exit();}}if (_statePool.ContainsKey(stateType)){_currentState = _statePool[stateType];}else{_currentState = CreateState(stateType);_statePool[stateType] = _currentState;}_currentStateType = stateType;Debug.Log(_currentStateType);_currentState.Enter();_currentState.Excute();callBack?.Invoke();}public static BaseState CreateState(int state){BaseState product = null;switch (state){case StateType.IDLE:{product = new IdleState();break;}case StateType.MOVE:{product = new MoveState();break;}case StateType.ATTACK:{product = new AttackState();break;}case StateType.RUNAWAY:{product = new RunState();break;}default:{Debug.LogWarning("not exist state:" + state);break;}}return product;}
}

欢迎加入Unity业内qq交流群:956187480

qq扫描二维码加群

【Unity开发小技巧】FMS有限状态机详解相关推荐

  1. Ubuntu小技巧15--awk命令详解

    Ubuntu小技巧15--awk命令详解 Ubuntu小技巧15--awk命令详解 1 基本介绍 1.1 工作原理 1.2 使用格式 2 常用功能介绍 2.1 格式化输出 2.2 从文件获取awk命令 ...

  2. 前端html小技巧—input标签详解

    今天分享下前端html小技巧-input标签详解 ,文中根据实例编码详细介绍,或许对大家的编程之路有着一定的参考空间与使用价值,需要的朋友接下来跟着云南仟龙Mark一起学习一下吧. 定义和用法 inp ...

  3. 【Unity开发小技巧】Unity打包IOS端APP

    目录 一:安装IOS的模块并打包 1.Hub可以添加IOS模块 2.项目内部下载安装ISO模块 3.添加我们需要打包的场景 二:XCode工程内部设置并打包 1.mac商店安装XCode软件并打开xc ...

  4. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 1.pc端通过鼠标中键调整相机的FieldOfView属性的值(会发生形变不建议) void Update(){if (Inp ...

  5. 【Unity开发小技巧】AudioManager声音管理器

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群,行业纵横颇多,每个人精通领域各异,旨在交流, 在项目里做音频管理的时候,我们往往是跟资源管理结合起来的,但是这里我们就单音频管 ...

  6. 【怎样写代码】小技巧 -- .NET配置文件详解

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  7. 【Unity开发小技巧】Unity日志输出存储

    一般我们在做项目的反馈日志收集的时候都会根据提交的后台日志判断线后Bug产生的大概原因,直接帮我们缩小范围. #region 模块信息 // ***************************** ...

  8. 【Unity开发小技巧】iOS APP下载安装时,如果出现此时无法下载安装APP的字样时,一些解决思路

    目录 一.OS系统和IOS版本更新 ​二:App-Store方式 三:Ad-hoc方式 四:In-house 方式 五: Architecture设置错误 六:App 支持的 iOS 系统版本,和当前 ...

  9. 【Unity开发小技巧】Unity随机概率扩展(概率可调控)

    做了以下两张图有助于理解,如果想调控概率的话直接修改概率数组即可,实战案例:http://t.csdn.cn/P9QKJ 其实在做概率类相关的界面效果的时候,我们真实做法都是在刷新界面前已经把结果获取 ...

最新文章

  1. 征战蓝桥 —— 2015年第六届 —— C/C++A组第5题——九数组分数
  2. 累了,开心一下。传说中的脑壳进水
  3. debian添加删除用户
  4. 关于解决织梦文档栏目删除后ID 从1开始的方法
  5. 专访Docker大牛:说服传统应用程序使用者是Docker面临的最大难题
  6. 精通数据科学_10篇文章变得更加精通数据科学
  7. Java案例:利用JDBC连接Oracle数据库
  8. 安全应对MySQL攻击
  9. 小米12 Ultra相机参数曝光:1.92亿像素主摄+1英寸超大底
  10. 黑客必学之社会工程学
  11. NYOJ 300 amp;amp; hdu 2276 Kiki amp; Little Kiki 2 (矩阵高速功率)
  12. java maven 混淆_maven混淆Java代码
  13. 配置activity-alias别名,更改app图标和名字
  14. 麦咖啡的设置,很长,如果你想百毒不侵的话。。
  15. 算术平均、几何平均、调和平均、平方平均和移动平均
  16. 2008年07月《安全天下事之莫须有的敌人与看得到的威胁》、2008年08月《安全天下事之七月流火》
  17. c语言有理数字符形式,C语言设计实现抽象数据类型有理数基本操作包括有理数的加法,减法,乘法,除法,以及求有理数的分子,分...
  18. python后端开发简历分享_Python后端开发工程师面试
  19. 面试前端的简历的注意事项
  20. Nvidia TX2爬坑过程——1、入手刷机教程

热门文章

  1. python淘课之家_python练习——moudule03——选课系统
  2. 回撤率 python 平台_python怎么计算最大回撤
  3. 存储介质(2)FLASH
  4. 1.决策技术解析与实现
  5. 【开奖】犀牛书获奖名单,留言开通成功,有奖征集意见赠书!
  6. 初学Java入门介绍
  7. 新增用户-用户密码加密-无解密
  8. 【python与数据分析】Pandas统计分析基础
  9. fegin设置header
  10. 定时器误触发功能详解