06.游戏AI方法之分层状态机
GameAI:06.游戏AI方法之分层状态机
在上期,我们了解了有限状态机。状态机作为一个强大的工具,在游戏开发中被广泛使用,但是在表示某些行为的时候,可能会遇到困难,这里我们就需要使用分层状态机。
**分层状态机 **
一个很常见的困难来源是警报行为。警报行为是指出现了中断正常行为,用来响应某种事项的行为。如果这种行为在有限状态机中表示,会让状态数量增加一倍。
比如,一个清洁机器人围绕一个设施移动做清洁,它会搜索掉落的物体并把物体拾起放到垃圾车里。 它的警报行为是:当它电力不足时,它必须赶到附近的充电点充电,不管当时正在做什么。
这种情况下,我们可以把状态机分为若干个,每个报警机制都有自己的状态机和原始行为,只有当较高层次的状态机未响应警报时才考虑下一个层次的状态机。

分层状态机的实现
在分层状态机里面,每个状态本身可以是一个完整的状态机。我们需要依靠递归来处理整个分层结构。
还要注意的是,原始状态机的初始状态是启动的,它总是从一个状态转换为另外一个状态并没有检查状态。但是在分层状态机里,就需要检查状态,因为它可以是无状态的,有可能有跨层次转换。
我们接着上期的C#实现:
创建一个State的子类StateHighLevel,并添加一些用来控制内部状态的成员变量
using UnityEngine;using System.Collections;using System.Collections.Generic;public class State: MonoBehaviour{ public List transactions;}public class StateHighLevel: State{ public List states; public State stateInitial; protected State StateCurrent;}
重写初始化函数
- -
- -
- -
- -
- -
- -
- - ```
public virtual void onEnable() { //todo //初始化状态}public override void onEnable(){ if ( StateCurrent == null) StateCurrent = stateInitial; StateCurrent.enabled = true;}
重写析构函数
public virtual void onDisable() { //todo //销毁状态}public override void onDisable(){ base.onDisable(); stateCurrent.enabled = false; foreach ( State s in states) { s.enabled = false; }}
**往期回顾:**
[05.游戏AI方法之有限状态机](http://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126044&idx=1&sn=2558f0d2b58d4d645cb741a2931637ca&chksm=80af3d36b7d8b420816b359499ad8de33070ad0f975e65bdd2bc4429e84611ab9de7ef112618&scene=21#wechat_redirect)
[04.《吃豆人》的游戏AI分析](http://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126021&idx=1&sn=9217462543701f128854d306e3ebab5b&chksm=80af3d2fb7d8b4392c323ec87c204c753911be328f6eafa5ed24da37f006029b191e293753f8&scene=21#wechat_redirect)
[03.游戏AI的鼻祖——《吃豆人》](http://mp.weixin.qq.com/s?__biz=MzAwNzc4MDgwNQ==&mid=2653126000&idx=1&sn=444925420c30d3798f0d100db6097826&chksm=80af3ddab7d8b4cc5623b7df97f9f3af38e1f0fd1e1d63f517db314f95608ab4a8aac12acab7&scene=21#wechat_redirect)