Unity有限状态机编写
有限状态机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有限状态机编写的更多相关文章
- 基于Unity有限状态机框架
这个框架是Unity wiki上的框架.网址:http://wiki.unity3d.com/index.php/Finite_State_Machine 这就相当于是“模板”吧,自己写的代码,写啥都 ...
- Unity Editor 编写unity插件类
在unity写了一个编辑类,基于iTweenpath插件,为了更方便的操作iTweenpath,顺便练习UnityEditor的操作,写了一个CreateiTweenPath,放在Editor文件夹中 ...
- Unity——有限状态机FSM修改
FSM状态机改 一.前言 FSM状态机初版 之前写过一版有限状态机,后来发现很多问题: 前一个版本是记录了当前的状态,切换状态时,要等下一帧状态机Update的时候才会调动上个状态的退出,总会有一帧的 ...
- Unity - 接入Android SDK
在网络上,关于Unity与Android如何进行交互,雨松MOMO大神已经有两篇文章简单介绍了如何操作(1)Unity3D研究院之打开Activity与调用JAVA代码传递参数(2)Unity3D研究 ...
- 开发unity DLL插件
最近开发一款设备的SDK,想着要开发unity版本,怎么做呢?首先想到的就是在外部编写相关的驱动程序然后集成成几个dll作为unity的SDK使用了.So,我就开始了unity外部插件的研究之旅了. ...
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- Unity 代码编译成dll 更新dll实现热更代码
Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...
- C#开发Unity游戏教程之Unity中方法的参数
C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...
- FSM有限状态机
1.什么是有限状态机 有限状态机(Finite State Machine),简称FSM,它由一组有限个状态.输入和根据输入及现有状态转换为下一个状态的转换函数组成,当然,通常每个状态机都必须有一个初 ...
随机推荐
- IOS 如何选择delegate、notification、KVO?
IOS 如何选择delegate.notification.KVO? 博客分类: IOS 前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有 ...
- Codeforces 519E A and B and Lecture Rooms
http://codeforces.com/contest/519/problem/E 题意: 给出一棵树和m次询问,每次询问给出两个点,求出到这两个点距离相等的点的个数. 思路: lca...然后直 ...
- PCB正片和负片有什么区别
概念:正片和负片是底片的两种不同类型. 正片:简单地说就是,在底片上看到什么就有什么. 负片:正好相反,看到的就是没有的,看不到的就是有的.见下图: 在 Allegro中使用正负片的特点: 正片:优点 ...
- vs2010 suite integration toolkit execution
原因是UltraDeamen的问题,重新换个WinMount来解压ISO文件.完美安装运行
- 简要介绍如何集成Vitamio安卓版SDK
1.下载VitamioBundle的最新稳定,这里下载的是最新版4.2.2. 2.解压缩后,导入 Vitamio 库工程(即vitamio)和Demo工程(即vitamio--sample)到 Ecl ...
- linux/unix 段错误捕获【续】
本文为“在C/C++中捕获段错误,打印出错的具体位置”的续篇,进一步解决涉及动态链接库的情况. 背景知识: ·linux/unix下动态链接库的基本原理 ·/proc/pid/maps文件的基本格 ...
- HDU--3466(0-1背包+贪心/后效性)
题意是: 给你一些钱 m ,然后在这个国家买东西, 共有 n 件物品,每件物品有 价格 P 价值 V 还有一个很特别的属性 Q, Q 指 你如过想买这件物品 你的手中至少有这钱Q . 虽 ...
- Django架设blog步骤
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- WebGIS在行业中应用的演变
结合我本身的项目及WebGIS在公检法行业中的应用,对此作了一个演变过程的总结: 第一阶段:GIS基本功能的应用:Data Show(数据展示):Search(搜索):Search b ...
- Android软键盘弹出时布局问题
最近项目需要做一个类似聊天室的模块,基于Socket实现的,这部分稍后一段时间再做总结,功能上的相关点都实现了小例子也做出来了,最后发现一个比较腻歪的问题就是软键盘弹出时总是会把标题“挤出”屏幕,(无 ...