您的位置:首页 > 其它

简单的有限状态机设计---上

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反应了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: