有限状态机FSM

是对行为逻辑的抽象。

在整个FSM架构中

首先有一个状态基类stateObject

里面有三个方法,分别是状态前、状态中、状态后。

所有具体行为类都要继承这个基类,在这三个方法中具体实现各种方法的逻辑。

然后,需要一个stateManager(大脑)状态管理类来管理这些状态,特别注意的是里面changeState方法,他是状态跳转的关键。

至于如果存储各种状态,你可以用list类 ,字典类等等。

写法:

建类:确认一共有几个状态,新建对应的几个类,还有他的Manager(管理类)和父类State

代码:

1.在父类中先public一个管理类类型的变量,为的是让每个状态对应一个状态管理者。然后写状态前,状态中,状态后三个方法。注意这三个方法的类型为virtual,方便子类进行重写。

因为状态前后都只执行一次,所以返回值为void。状态中的返回值类型为该类类型,可以先返回空值。

2.让所有状态类继承该父类,并对里面的方法进行重写。在三个方法中添加自己的行为逻辑。注意在状态中的return中返回this(当前状态自身)

3.写管理类(重点):

1)首先管理类也要继承该父类。可以做成状态字典,存储对象的所有状态,只有在这个状态字典中才可以转换调用。注意,如果要使用字典必须using System.Collection.Generic。字典写法:Dictionary<string, State> stateDic;

String用来传状态名称,State为当前状态所有对象。然后定义当前状态:State currentState;

和上一个状态:State lastState;

2)在构造器中进行初始化stateDic = new Dictionary<string, State>();

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class StateManager : State

{

//状态管理类 用字典,是功能类

//状态字典,存储对象的所有状态,只有在这个状态字典中才可以转换调用

Dictionary<string, State> stateDic;

//当前状态

State currentState;

//上一个状态

State lastState;

//初始化放在构造器中

public StateManager()

{

stateDic = new Dictionary<string, State>();

}

//注册状态,需要状态名字和状态参数的形参

public void RegisterState(string stateName, State state)

{

//每一次注册一个状态时,就指定这个状态的状态管理者的字段对应注册的这个对象

//this指代当前类对象实例Dictionary<string, State>(),谁.RegisterState就是谁

//作用是让一个对象的多个状态都指向同一个管理者

state.stateManager = this;

//向状态字典中添加,传递形参状态

stateDic.Add(stateName, state);

}

//设置默认状态,传递状态名为形参

public void SetDefaultState(string stateName)

{

//判断方法列表是否包含这样的一个状态(key值)

if (!stateDic.ContainsKey(stateName))

{

Debug.LogError("状态列表无此状态");

}

//设置默认状态

currentState = stateDic[stateName];

}

//改变状态

public void ChangeState(string stateName)

{

//判断方法列表是否包含这样的一个状态(key值)

//改变状态失败

if (!stateDic.ContainsKey(stateName))

{

Debug.LogError("状态列表无此状态,切换失败");

currentState = lastState;

}

//切换成功,更改状态

currentState = stateDic[stateName];

}

//状态的执行

public void DoState()

{

//第一次执行的时候current是设置的默认状态,lastState是空

if (currentState != lastState)//加入默认状态为sleep//current=sleep;last=null //第2轮.current=eat;last=sleep

{

currentState.EnterState();//sleep的进入方法,只执行一次//current=sleep;last=null

//把后一个状态赋给当前状态,跳出if条件

lastState = currentState;//current=sleep;last=sleep

}

//执行“状态中”

lastState.StayState();//sleep的持续方法 //current=sleep;last=sleep

//退出状态                                  //sleep切换为eat//current=eat;last=sleep

if (lastState != currentState)//current=eat;last=sleep

{

lastState.ExitState();          //sleep退出

}

}

}

然后新建一个挂在游戏物体上的类

using UnityEngine;

using System.Collections;

public class FSMManager_Boss : MonoBehaviour {

StateManager_Boss manager;

// Use this for initialization

void Start () {

manager = new StateManager_Boss();

// 注册状态

manager.RegisterState("idle", new IdleState_Boss());

manager.RegisterState("run", new RunState_Boss());

manager.RegisterState("attack", new AttackState_Boss());

manager.RegisterState("Death", new DeathState_Boss());

//设置初始状态

manager.SetDefaultState("idle");

}

// Update is called once per frame

void Update () {

manager.DoState();

}

}

Unity有限状态机编写的更多相关文章

  1. 基于Unity有限状态机框架

    这个框架是Unity wiki上的框架.网址:http://wiki.unity3d.com/index.php/Finite_State_Machine 这就相当于是“模板”吧,自己写的代码,写啥都 ...

  2. Unity Editor 编写unity插件类

    在unity写了一个编辑类,基于iTweenpath插件,为了更方便的操作iTweenpath,顺便练习UnityEditor的操作,写了一个CreateiTweenPath,放在Editor文件夹中 ...

  3. Unity——有限状态机FSM修改

    FSM状态机改 一.前言 FSM状态机初版 之前写过一版有限状态机,后来发现很多问题: 前一个版本是记录了当前的状态,切换状态时,要等下一帧状态机Update的时候才会调动上个状态的退出,总会有一帧的 ...

  4. Unity - 接入Android SDK

    在网络上,关于Unity与Android如何进行交互,雨松MOMO大神已经有两篇文章简单介绍了如何操作(1)Unity3D研究院之打开Activity与调用JAVA代码传递参数(2)Unity3D研究 ...

  5. 开发unity DLL插件

    最近开发一款设备的SDK,想着要开发unity版本,怎么做呢?首先想到的就是在外部编写相关的驱动程序然后集成成几个dll作为unity的SDK使用了.So,我就开始了unity外部插件的研究之旅了. ...

  6. 【Unity与23种设计模式】解释器模式(Interpreter)

    GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...

  7. Unity 代码编译成dll 更新dll实现热更代码

    Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...

  8. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...

  9. FSM有限状态机

    1.什么是有限状态机 有限状态机(Finite State Machine),简称FSM,它由一组有限个状态.输入和根据输入及现有状态转换为下一个状态的转换函数组成,当然,通常每个状态机都必须有一个初 ...

随机推荐

  1. 如何监听input的脚本赋值

    今天记录下我解决input值改变监听,大家肯定首先想到onchange方法.对于实时监听改变用onpropertychange.oninput等方法:可是,onchange并不能监听脚本改变的值,对于 ...

  2. vuex构建笔记本应用学习

    vuex:针对vue应用派生的专门管理应用state的工具,state可以理解为我们组件需要操作的data数据,都知道,vue构建spa应用的时候,随着组件规模的提升,各个子组件之间的通信如果采用子组 ...

  3. JavaScript对象基础知识

    1.对象所包含的元素一组包含数据的属性.如人的名字.书的价格和手机型号等.允许对属性中所包含的数据进行操作的方法. 2.引用对象的途径一个对象真正地被使用,可以采用以下几种方式.引用Javascrip ...

  4. Keil的可重定位段

    对于一个大的文件,为了便于管理,一个好的办法时把一个大文件分为若干个小文件,每个小文件包含一部分相关的功能,这样功能将显得很整洁,而且移植到其它工程的时候也很方便,把文件copy过去即可. 对于汇编, ...

  5. PHP 面向对象中常见关键字使用(final、static、const和instanceof)

    PHP 面向对象中常见关键字的使用: 1.final :final关键字可以加在类或者类中方法之前,但是不能使用final标识成员属性. 作用: 使用final标识的类,不能被继承. 在类中使用fin ...

  6. 设置MATLAB中figure的背景为白色

    matlab的图形窗口每次背景都是灰色的,而我希望每次都是白色的背景,方便用图: 每次总是需要添加figure('color','w');或者figure('color',[1 1 1])或者set( ...

  7. Web Service 初步了解

    Web Service见名之意就是网络上的一些服务,解决的问题就是如何使用这些服务,因为软件的开发有各种各样的语言,利用Java,C#,VB.NET,PHP等等,如何使这些语言编写的程序能够进行互通, ...

  8. XPath详解

     xPath技术   1 引入 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! 2 xPath作用 主要是用于快速获取所需的节点对象. 3 在dom4j中如何使用 ...

  9. 贪心-hdu-1789-Doing Homework again

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1789 题目意思: 有n个作业,每个作业有一个截止日期,每个作业如果超过截止日期完成的时候有一个惩罚值 ...

  10. hdu 3917 最大重量封闭图

    /*最大重量封闭图: 意甲冠军:一些城市要建路需要负责一些公司,每家公司都需要缴纳个税.该公司将需要花费每路,另一个限制条件,如果那家公司a既定a-b.公司b既定b-c然后选择 公司a 你必须选择一个 ...