简单的有限状态机设计---上
2016-05-09 09:53
253 查看
大家好,这次给大家分享下最近学习到的有限状态机的简单制作,我们先介绍下什么是有限状态机。
有限状态机(Finite State Machine) FSM 就是由一组状态组成,状态机会根据状态 、情况改变当下的状态。
比如我们要设计一个怪物的AI,首先这个怪物有好几组状态: 空闲状态 Idle、攻击状态Attack、巡逻状态、死亡状态。
当然我们还可以加入更多状态,再根据逻辑中的实现,让怪物判断当前环境需要使用什么状态,比如在看到玩家的时候,首先查看自己的血量超不超过50%,如果超过则改变到攻击状态和玩家战斗,否则进行逃跑状态,等。。
这个判断就是一个有限状态机的行为过程。我们可以用if elseif elseif 。。。大量的if else来实现,也或者使用switch case 来实现判断,另外一种就是使用通用的框架来实现,我们首先使用switch来尝试制作。
首先我们制作的一个例子,有一个AI角色,它的逻辑有
1,初始状态是巡逻状态 Patrol,这时候它会选择一个我们设定好的点循环移动,(当然我们可以自己修改得更复杂点)如果发现了玩家,它会进入追逐状态 Chase。
2 在追逐状态中,如果玩家离开了AI的攻击范围,则继续追逐,如果在攻击范围内,则进入攻击状态Attack ,发射子弹。
3 在攻击状态下,如果玩家离开攻击范围,再次追逐,如果玩家很远,离开了我们预设的距离,则需要忘记玩家,重新回到巡逻状态。
然后我们开始搭建一个简单的环境来演示一下 ,先添加一个地面,添加Tag:Player(玩家),PatrolPoint(寻路点),Bullet(子弹)
EnemyAI (怪物AI)
创建一个空物体,然后添加几个立方体,都添加上PatrolPoint标签,我们的怪物AI就可以把这些点当做巡逻点移动了
然后我们再创建一个子弹预设物,使用一个球形sphere 添加刚体,然后在添加一个脚本 bullet.cs
脚本的代码应该是这样的
[C#] 纯文本查看 复制代码
?
接下来我们创建一个敌人AI,为了能简单演示,我就直接创建一个第一人称角色控制器 加上碰撞盒,然后添加一个脚本SimpleFSM.cs 。
该脚本能控制敌人AI的移动,这个脚本基于FSM状态制作的,所以还需要继承一个FSM的父类脚本FSM.cs
SimpleFSM.cs的代码
[C#] 纯文本查看 复制代码
?
父类FSM.cs的代码
[C#] 纯文本查看 复制代码
?
最后,我们实现一下玩家,同样,我们为了简单些,直接使用一个第一人称角色控制器,将Tag选择为Player 具体脚本就不写了,我们直接在Scene 场景中拖动player 玩家移动,
就可以看到我们的怪物AI的一系列AI反应了。
有限状态机(Finite State Machine) FSM 就是由一组状态组成,状态机会根据状态 、情况改变当下的状态。
比如我们要设计一个怪物的AI,首先这个怪物有好几组状态: 空闲状态 Idle、攻击状态Attack、巡逻状态、死亡状态。
当然我们还可以加入更多状态,再根据逻辑中的实现,让怪物判断当前环境需要使用什么状态,比如在看到玩家的时候,首先查看自己的血量超不超过50%,如果超过则改变到攻击状态和玩家战斗,否则进行逃跑状态,等。。
这个判断就是一个有限状态机的行为过程。我们可以用if elseif elseif 。。。大量的if else来实现,也或者使用switch case 来实现判断,另外一种就是使用通用的框架来实现,我们首先使用switch来尝试制作。
首先我们制作的一个例子,有一个AI角色,它的逻辑有
1,初始状态是巡逻状态 Patrol,这时候它会选择一个我们设定好的点循环移动,(当然我们可以自己修改得更复杂点)如果发现了玩家,它会进入追逐状态 Chase。
2 在追逐状态中,如果玩家离开了AI的攻击范围,则继续追逐,如果在攻击范围内,则进入攻击状态Attack ,发射子弹。
3 在攻击状态下,如果玩家离开攻击范围,再次追逐,如果玩家很远,离开了我们预设的距离,则需要忘记玩家,重新回到巡逻状态。
然后我们开始搭建一个简单的环境来演示一下 ,先添加一个地面,添加Tag:Player(玩家),PatrolPoint(寻路点),Bullet(子弹)
EnemyAI (怪物AI)
创建一个空物体,然后添加几个立方体,都添加上PatrolPoint标签,我们的怪物AI就可以把这些点当做巡逻点移动了
然后我们再创建一个子弹预设物,使用一个球形sphere 添加刚体,然后在添加一个脚本 bullet.cs
脚本的代码应该是这样的
[C#] 纯文本查看 复制代码
?
该脚本能控制敌人AI的移动,这个脚本基于FSM状态制作的,所以还需要继承一个FSM的父类脚本FSM.cs
SimpleFSM.cs的代码
[C#] 纯文本查看 复制代码
?
[C#] 纯文本查看 复制代码
?
就可以看到我们的怪物AI的一系列AI反应了。
相关文章推荐
- MUI卸载动画——粒子爆炸
- JPA原理理解
- Codeforces Round #348 E. Little Artem and Time Machine(给你一个n,有三种选择,1表示增加一个值,2表示删除这个数的一个值,3表示查询)
- c++/对*和->的重载
- 常用的表单控件的数据获取方式
- OpenCV直线拟合
- Centos 添加静态路由及 SIOCADDRT错误处理
- Qt中关于undefined reference to `vtable for 错误解决
- 企业网站,个人博客,白帽SEO正规优化心得分享
- App接口设计
- 软件工程●构建工具
- 总结Hbase 与 MongoDB
- Django系列二:Django 创建第一个项目
- git checkout 远程分支
- 解决android4.4以上获取不到图片路径问题
- IOS应用启动时渐变等待
- Oracle 中取当前日期的上个月最后天和第一天
- Cocoapods安装教程
- 用d3引擎将数学函数绘制成图形
- TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议