U3d_人工智能[三]之有限状态机

1. 大致思路

由于npc会有很多种状态,不同的情况会有不同的状态,不同状态会处做不同的事情.为了方便所有状态的行为与状态之间的切换,我们创建一个所有状态的父类FSMState,并创建FSMSystem类来管理各个状态.

2. 转换条件和状态

首先我们先创建两个enum类型,用来存放转换条件与状态.在不同 的状态下,出现不同的转换条件会发生不同的事情.
/// <summary>
/// 转换条件
/// </summary>
public enum Transition
{
    NullTransition=0,
    SeePlayer,//看见主角
    MissPlayer//丢失主角
}
/// <summary>
/// 状态ID
/// </summary>
public enum StateID
{
    NullStateID=0,
    Patrol,//巡逻状态
    FollowPlayer//跟随主角状态
}

3. 所有状态的基类FSMState

这个类本省是一个状态,而这个状态下,不同的转换条件会转换成不同的状态.所以用一个字典来存储.当前状态与StateID是一一对应的,我们还需要一个StateID类型变量来存储当前处于什么状态.     
    protected StateID stateID;//当前状态
    public StateID ID { get { return stateID; } }
    //当我们构造出一个状态的时候,也构造出这个字典,表示当前这种状态在什么转换条件下可以转换成什么状态
    protected Dictionary<Transition, StateID> map = new Dictionary<Transition, StateID>();


    public FSMSystem fsm;//这个状态归哪个状态机管
    public FSMState(FSMSystem fsm)
    {
        this.fsm = fsm;
    }
有字典的话,自然需要有添加和删除字典元素的功能
    /// <summary>
    /// 为字典map添加数据
    /// </summary>
    /// <param name="trans">转换条件</param>
    /// <param name="id">状态</param>
    public void AddTransition(Transition trans, StateID id)
    {
        if (trans == Transition.NullTransition)
        {
            Debug.LogError("不允许NullTransition"); return;
        }
        if (id == StateID.NullStateID)
        {
            Debug.LogError("不允许NullStateID"); return;
        }
        if (map.ContainsKey(trans))
        {
            Debug.LogError("添加转换条件的时候," + trans + "已经存在于map中"); return;
        }
        map.Add(trans, id);
    }
    /// 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值