一、有限状态机的概念
有限状态机简称状态机,是表示有限个状态,以及在状态之间的转移和动作等行为的数学模型。状态机的要素有状态和状态转移两个。
在Unity中,动画状态机最重要的属性就是节点和连线,其中每个节点都是一个动画片段(或动画融合树),而没跟连线代表着可以从一个状态转移到另一个状态。
对动画来说,动画状态的转移是有条件的,一般是通过设定动画变量,使得动画播放完毕时能够跳转到另一个动画状态 。其他编程逻辑也是一样,总要设计出一些必要的状态,并定义状态之间的转移条件,才能把一个复杂的逻辑描述清楚。
1、状态机用于电子体重秤设计
AI状态机既可以用于复杂逻辑也可以用于简单逻辑,此处先从一个简单的、不属于AI的例子开始——电子体重秤。
电子体重秤是一种常见的电子设备,一般不需要用按钮或遥控器操作,使用时人只需要站在上面,或者把需要称重的物体放在上面,保持几秒钟,很快就会在小屏幕上显示出测量的结果。
其工作流程是自动化的,背后也有一段程序控制其测量过程。如果用状态机的方法分析它,它应当具有几种状态?状态之间又是如何切换的呢?
根据使用流程分析出它的基本工作状态如下:
- 休眠状态
- 启动状态(初始化)
- 测量状态(数字会持续变化的状态)
- 锁定状态(数字不再变化的状态)
不再使用时会回到休眠状态,因此基本上只有以上几种工作状态。
其状态转移的条件如下:
- 在休眠状态下,如果感受到压力则启动
- 启动后立即进入测量状态
- 在测量状态下,持续测量并显示当前重量值。如果重量在几秒内没有变化,进入锁定模式
- 锁定状态,显示测量结果,数字闪烁 提示。在锁定状态下一段时间后压力不变则进入休眠状态;如果压力大幅变化则再次进入测量状态
将以上描述化成状态转移图,如图:
以上状态转移图是根据观察分析得出的结论,其他电子体重秤的逻辑可能有所不同。但重要的是,可以设想集中常规和非常规使用场景,去分析和测试是否存在设计漏洞,如以下设想。
- 在锁定后离开体重秤。体重秤发现压力大幅降低,切换到测量状态,然后再次进入锁定状态。
- 在测量未结束时离开体重秤。测量值变为0,一段时间后进入测量状态。
- 锁定时再加上一些重物。体重秤发现重量变化,再次进入测量状态。
还可以举出很多像这样的测试例子。经过推演发现,很多特殊行为都会转移到锁定状态,逻辑上没有明显漏洞。在设计上未发现错误的状态机就可以考虑用代码实现了,细节问题可以在功能实现后进一步测试。
2、状态机用于游戏逻辑设计
某些看似简单的游戏,实际编写的代码并不简单。例如,经典的电子游戏俄罗斯方块,用编程实现它对于初学者来说相当具有挑战性。
就俄罗斯方块来说,游戏中有一些逻辑并不是显而易见的。例如按方向键的时候如何处理?从表面上看,按下方向键时正在下落的方块应当左右移动,但是如果进一步分析什么时候会出现正在下落的方块,就会发现有方块下落的状态仅仅是多个游戏状态中的一种。
俄罗斯方块的游戏流程,至少分为生成方块、方块下落、方块固定、消除整行方块、游戏结束5种状态,其中只有方块下落状态是受玩家控制的,其他状态都不用考虑玩家的输入。从状态机的角度考虑,游戏逻辑会变得十分清晰,如图:
编写逻辑时,代码中有一个关键变量——CurrentState(当前状态)。代码按照状态分成5部分,每一帧格局当前状态执行其中的一部分,满足某条件时修改当前状态,影响下一帧执行的逻辑。
严格按照这种思路编写代码,就可以避免大量的条件判断,让代码变得清晰,从而减少出错的可能性。
3、状态机应用于游戏AI设计
现代的很多游戏中都有一些具备简单智能的敌人,特别是潜行类游戏,例如在《细胞分裂》等游戏中,具有一定智能的敌人是游戏设计的核心,也是让玩家乐此不疲、不断挑战的动力。
以下是几个例子:
-
敌人AI:在一个射击游戏中,敌人的行为可以由状态机控制。比如,当敌人处于"巡逻"状态时,它会在指定区域内来回移动;当敌人检测到玩家进入其感知范围时,它会切换到"追逐"状态并开始追击玩家;当敌人受到攻击并生命值降低时,它可能会切换到"逃跑"状态以寻找掩体或者呼叫援助。
-
玩家角色AI:在一个角色扮演游戏中,玩家角色的行为也可以由状态机来控制。比如,当玩家角色处于"探索"状态时,它会自由地在游戏世界中移动和探索;当玩家角色进入战斗时,它会切换到"攻击"状态并执行攻击动作;当玩家角色生命值过低时,它可能会切换到"撤退"状态以避免被击败。
-
NPC角色AI:在一个角色扮演游戏或者生存游戏中,非玩家角色(NPC)的行为也可以利用状态机来设计。比如,一个NPC农民的状态机可以包括"种田"、“收割”、"出售农产品"等状态,根据当前的任务和条件来决定下一个动作。
这只是状态机在游戏AI设计中的一些简单应用举例,实际上,状态机可以处理更加复杂的行为和决策流程,从而使游戏角色的行为更加智能、有趣和逼真。