状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum StateType
{
Idle,
Die,
Move,
}

public abstract class StateObject
{
protected StateManger state;
public StateObject(StateManger _sm)
{
state = _sm;
}
//进入方法
public abstract void EnterState();
//离开方法
public abstract void ExiState();
//持续更新方法
public abstract void UpdateState();
}
//站着状态
public class IdleState : StateObject
{
public IdleState(StateManger state):base(state)
{

}

public override void EnterState()
{
Debug.Log("进入站着状态");
}

public override void ExiState()
{
Debug.Log("离开站着状态");
}

public override void UpdateState()
{
Debug.Log("等待站着状态");
if (Input .GetKey(KeyCode.M))
{
Debug.Log("按下咯");
state.ChangeState("Move");
}
if (Input.GetKey(KeyCode.D))
{
state.ChangeState("Die");
}
}
}
//移动状态
public class MoveState : StateObject
{
public MoveState(StateManger state):base(state)
{

}
public override void EnterState()
{
Debug.Log("进入移动状态");
}

public override void ExiState()
{
Debug.Log("离开移动状态");
}

public override void UpdateState()
{
Debug.Log("进入移动更新状态");
if (Input.GetKey(KeyCode.D))
{
state.ChangeState("Die");
}
if (Input.GetKey(KeyCode.I))
{
state.ChangeState("Idle");
}
}
}
//死亡状态
public class DieState : StateObject
{
public DieState(StateManger state) : base(state)
{

}
public override void EnterState()
{
Debug.Log("进入死亡状态");
}

public override void ExiState()
{
Debug.Log("离开死亡状态");
}

public override void UpdateState()
{
Debug.Log("进入死亡更新状态");

if (Input.GetKey(KeyCode.I))
{
state.ChangeState("Idle");
}
}
}
public class StateManger {
//字典存储状态
Dictionary<string, StateObject> dic = new Dictionary<string, StateObject>();
//当前状态
StateObject currentstate;
//注册状态
public void Region(string statename,StateObject state)
{
//判断字典中是否存在这个键
if (!dic.ContainsKey(statename))
{
dic.Add(statename,state);
}
}
//设置默认状态
public void SetDefat(string statename)
{
//判断字典中是否存在这个状态
if (dic.ContainsKey(statename))
{
//存在就赋值给currentstate
currentstate = dic[statename];
//调用当前状态的进入(EnterState)方法
currentstate.EnterState();
}
}
//改变状态
public void ChangeState(string statename)
{
//判断字典中是否存在这个状态
if (dic.ContainsKey(statename))
{
//当前状态是否为空
if (currentstate!=null)
{
//调用上一个状态的离开方法
currentstate.ExiState();
//把取到的状态赋值给currentstate
currentstate = dic[statename];
//调用取到状态的进入方法
currentstate.EnterState();
}
}
}
//更新状态
public void UpdateState()
{
Debug.Log("更新状态");
if (currentstate!=null)
{
//当前状态的UpdateState方法
currentstate.UpdateState();
}
}
}
public class FMSC : MonoBehaviour {
StateManger sm = new StateManger();
// Use this for initialization
void Start () {
//注册站着的方法
sm.Region("Idle",new IdleState(sm));
//注册死亡的方法
sm.Region("Die",new DieState(sm));
//注册移动的方法
sm.Region("Move",new MoveState(sm));
//设置默认状态
sm.SetDefat("Idle");
}

// Update is called once per frame
void Update () {
//持续调用当前状态的UpdateState方法
sm.UpdateState();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189

---------------------

Unity c# 状态机的简单入门的更多相关文章

  1. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  2. 数据结构和算法(Golang实现)(6)简单入门Golang-并发、协程和信道

    并发.协程和信道 Golang语言提供了go关键字,以及名为chan的数据类型,以及一些标准库的并发锁等,我们将会简单介绍一下并发的一些概念,然后学习这些Golang特征知识. 一.并发介绍 我们写程 ...

  3. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  4. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  5. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  8. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  9. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

随机推荐

  1. MyBatis学习 之 七、mybatis各种数据库的批量修改

      MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. 注意:下 ...

  2. 洛谷P1466集合——背包

    题目:https://www.luogu.org/problemnew/show/P1466 水题,注意开long long; 代码如下: #include<iostream> #incl ...

  3. windows上搭建php环境

    在Windows 7下进行PHP环境搭建,首先需要下载PHP代码包和Apache与Mysql的安装软件包. PHP版本:php-5.3.2-Win32-VC6-x86,VC9是专门为IIS定制的,VC ...

  4. 09_多线程下载_获取文件长度&计算下载范围

    package com.itheima.multiThreadDownload; //import java.net.MalformedURLException; import java.io.Ran ...

  5. ORACLE PL/SQL 实例精解之第二章 通用编程语言基础

    通用编程语言基础 2.1PL/SQL编程基础 1. 字符类型:支持四中类型字符:字母,数字,符号和空格,组合一个或多个字符就会创建一个词汇单元 2. 词汇单元 a.标识符必须以字符开头 b.保留字是p ...

  6. HDU6035:Colorful Tree(树形DP)

    传送门 题意 给出一棵最小生成树及每个节点的颜色,询问\(\frac{n(n-1)}2\)条路径的权值和,一条路径的权值为该路径的颜色种数 分析 勉强理解了ftae的做法,但是代码还是不太会,还是太弱 ...

  7. HDOJ1864(水的可怜)

    注意这句话:精确到小数点后两位如果是小数点的话 HDOJ1864 #include<stdio.h> #include<iostream> #include<algori ...

  8. bzoj 4197: [Noi2015]寿司晚宴【状压dp】

    一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...

  9. Java反编译工具-JD-GUI

    Java是跨平台的,JD-GUI提供了多个系统的支持,但是不建议直接安装,最快的方式推荐直接下载JAR包,然后用java -jar进行运行. 就现在的版本是1.4.0,停留在2015年,估计近期会更新 ...

  10. Mice and Holes CodeForces - 797F

    Mice and Holes CodeForces - 797F 题意:有n只老鼠和m个洞,都在一个数轴上,老鼠坐标为x[1],...,x[n],洞的坐标为p[1],...,p[m],每个洞能容纳的老 ...