跳到主要内容
P小二 P小二
← 返回文章 • 游戏AI • • 约 5 分钟

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方法之有限状态机

04.《吃豆人》的游戏AI分析

03.游戏AI的鼻祖——《吃豆人》