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,它由一组有限个状态.输入和根据输入及现有状态转换为下一个状态的转换函数组成,当然,通常每个状态机都必须有一个初 ...
随机推荐
- Leakcanary
一.什么是内存泄漏 垃圾回收器无法回收应被回收的对象比如:在Activity生命周期过程中,旋转屏幕时应新建activity,原activity应被销毁.但如果线程一直在引用此activity,则会出 ...
- Unity GUI 用C#和Javascript写法的区别
以前都是用C#来写Unity的GUI.后来因为团队需要GUI必须用C#写. 其实一开始学Unity的GUI的时候我是想用C#来写,后来折腾了好久也没弄出来.反倒是这次不经意间就搞好了. C#和Java ...
- linux系统时间和硬件时钟问题(date和hwclock)
http://blog.chinaunix.net/uid-182041-id-3464524.html http://blog.csdn.net/duyiwuer2009/article/detai ...
- 选择Comparable接口还是Comparator
个人理解: 如果我本身知道这个类的对象我要用来比较,那么就拿这个类实现Comparable接口(compareTo(Object o) 方法).如果我本身没有预料到我要比较这个类的对象,那么,我可以建 ...
- css中的段落样式及背景
一.段落样式 css中关于段落的样式主要有行高,缩进,段落对齐,文字间距,文字溢出,段落换行等.它们的具体语法如下: line-height : normal | length text-indent ...
- css中的边框样式
在盒子模型中,盒子的边框是其重要的样式,通过边框我们可以很方便地看出盒子的长宽以及大小.边框的特性可以通过边框线,边框的宽度及颜色来呈现. 1,边框线 边框线指的是边框线条的样式,包括实线,虚线,点划 ...
- (转)iOS7界面设计规范(5) - UI基础 - 导航
通过分页控件(page control)来暗示多个条目或内容视图的存在.该控件可以有效的向用户展示内容单元的数量,以及当前所见的这一条在队列中的位置.请参考分页控件一节,了解更多详情. 注意:虽然工具 ...
- Andriod Studio科学文章——4.常见问题解答有关编译
1.android未安装支持库 只有编译,下面的例子演示了提样: Could not find any version that matches com.android.support:appcomp ...
- HDU 3265 Posters(线段树)
HDU 3265 Posters pid=3265" target="_blank" style="">题目链接 题意:给定一些矩形海报.中间有 ...
- HDU--4784 Dinner Coming Soon DP+BFS
题意非常长非常变态.一个人要到他男朋友家,他最初有R元以及T分钟的时间来赶到他男朋友家.有N个房子M条道路,每条道路有须要消耗的时间以及过路费,同一时候还要顺路做食盐生意,起初身上没有食盐,最多带B袋 ...