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;
}}
往期回顾: