状态机模式在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

每个状态都是有自己的方法,在每个状态有不同要做的事情,减少代码的耦合性
---------------------

转载于:https://www.cnblogs.com/hyhy904/p/11001406.html

Unity c# 状态机的简单入门相关推荐

  1. Unity 2D游戏开发快速入门(内部资料)

    Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前  言 Unity是一款综合的游戏开发工具 ...

  2. .NET 状态机Automatonymous快速入门

    介绍 Automatonymous是.NET开发人员的状态机库.它提供了一种流畅的语法来声明状态机,包括状态,事件(支持触发器和数据事件)以及状态/事件活动.尽管Automatonymous在简单的状 ...

  3. 拜占庭共识Tendermint介绍及简单入门

    1.Tendermint是什么 Tenermint 是一个软件,用于在多台机器安全一致地复制一个应用.所谓安全,指的是即使有多达 1/3 的机器出现任意故障的情况下, Tendermint 仍然能够正 ...

  4. 关于Unity动画状态机Animator使用教程

    关于Unity动画状态机Animator使用教程 目录一.前言二.Animator组件三.AnimatorController文件四.AnimationClip文件五.状态机的状态(State)1.A ...

  5. BizTalk 2006 简单入门示例程序(附源项目文件下载)

    BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...

  6. python如何读取mat文件可视化_python Matplotlib数据可视化(1):简单入门

    1 matplot入门指南 matplotlib是Python科学计算中使用最多的一个可视化库,功能丰富,提供了非常多的可视化方案,基本能够满足各种场景下的数据可视化需求.但功能丰富从另一方面来说也意 ...

  7. ARM NEON 编程简单入门1

    原文:http://blog.csdn.net/silentob/article/details/72954618  ARM NEON 编程简单入门1 NEON简介 NEON是适用于ARM Corte ...

  8. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  9. EChart.js 简单入门

    EChart.js 简单入门 最近有一个统计的项目要做,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库. MSChart   这个是Visual Studio里的自带控件,使用比 ...

最新文章

  1. python furl模块 网址修改 参数解析
  2. 黄金——家家都应藏有的投资品(转载自新浪)
  3. PHP接入支付宝手机网站支付、移动支付接口
  4. 《蘑菇街编程题》回文串
  5. 复习知识点:UITableView和UICollectionView的常用属性
  6. mac 删除php56 安装php72,mac php56升级php70
  7. 用Python将多张图片合并成一PDF文件
  8. 单例模式——饿汉式和懒汉式
  9. WaitForMultipleObjects函数及原子操作Interlocked系列函数
  10. 嵌入式开发之GCC编译器使用
  11. iOS开发那些事--nib、xib与故事板的关系
  12. AR人体姿态识别,实现无边界的人机交互
  13. 测绘 绘图 计算机,CAD及制图测绘工程制图
  14. Java替换第一个和最后一个字符串
  15. 电脑里的所有播放器只能播放声音没有画面
  16. AD(altium designer)15原理图与PCB设计教程(五)——工程编译与报表生成
  17. 安全算法-对称加密与非对称加密
  18. UE脱机激活如何不拔网线实现在线激活
  19. 《数字图像处理》第三章学习总结感悟1:灰度变换与空间滤波概念及常用灰度变换方法介绍
  20. 如何清理系统大量的残余文件和系统垃圾文件?(win10)

热门文章

  1. C4C的Rich text editor的JavaScript实现
  2. 关掉微软Word的一些不必要的插件,提高启动速度
  3. SAP标准培训课程C4C10学习笔记(三)第三单元
  4. 介绍python修饰器的书_python修饰器
  5. 两个tplink路由器有线桥接_tplink和腾达路由器有线桥接设置图解
  6. Redis启动报错:[20000] 07 Apr 17:55:34.562 # Creating Server TCP listening socket 127.0.0.1:6379: bind: N
  7. 附件中可能包含对计算机有害的病毒.附件可能无法正确显示,广西成人高校计算机实用基础统考理论试题(A卷)...
  8. mysql 表 地图_报表中的地图怎么做?
  9. python filestorage对象怎么转化成字符串_Python面试的10个常见问题及答案,检验你的学习成果吧!...
  10. python计算每月工资多少钱_[Python]CCF——工资计算(201612-2)