关于FSM(有限状态机)的学习(1)

以下内容参照《unity3d 人工智能编程》--Aung Sithu Kyaw,Clifford Peters ,Thet Naing Swe编著

最近在研究此书,花费几天时间,略有收获,所以写下此编文章,计划是3章,这是第一章,受个人能力限制,这个只是我的粗陋之见。

本文主要讲述的是有限状态机的框架

首先1,2是源码,3是我个人学习的一些收获。

首先贴下此书源码下载地址,http://hzbook.com/Books/8580.html,请大家尊重知识产权,如果有需要自行购买(非广告)。


父类:


using UnityEngine;
using System.Collections;

/// 
/// 状态机父类
/// 
public class FSM : MonoBehaviour {

    protected Transform playerTransform;
    //下一个点的位置
    protected Vector3 destPos;
    //巡逻点的数组
    protected GameObject[] pointList;
    //射击旋转的角度
    protected float shootRate;
    //经过的时间
    protected float elapsedTime;
    //炮塔
    public Transform turret { get; set; }
    //炮塔旋转点
    public Transform bulletSpwanPoint { get; set; }

    protected virtual void Initialize() { }
    protected virtual void FSMUpdate() { }
    protected virtual void FSMFixedUpdate() { }

    protected Rigidbody rb;

    void Start()
    {
        //初始化
        Initialize();
        rb = GetComponent();
        //pointList = new GameObject[GameObject.FindGameObjectsWithTag("WandarPoint").Length];

    }

    void Update()
    {
        FSMUpdate();
    }

    void FixedUpdate()
    {
        FSMFixedUpdate();
    }

   
}


这个是人工智能(有限状态机)的总的父类


然后是继承它的子类

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// 
/// 用于切换状态的建
/// 
public enum Transition
{
    None = 0,
    SawPlayer,
    ReachPlayer,
    LostPlayer,
    NoHealth
}

/// 
/// 用于切换状态的值
/// 
public enum FSMStateID
{
    None = 0,
    Patrolling,
    Chasing,
    Attacking,
    Dead
}

public class AdvancedFSM : FSM
{
    //存储但前类的数组
    private List fsmStates;

    //当前状态的ID(值)
    private FSMStateID currentStateID;
    public FSMStateID CurrentStateID
    {
        get { return currentStateID; }
    }
    //当前状态
    private FSMState currentState;
    private FSMState CurrentState
    {
        get { return currentState; }
    }
    //构造方法,初始化
    public AdvancedFSM()
    {
        fsmStates = new List();
    }
    /// 
    /// 增加FSM状态
    /// 
    /// 
    public void AddFSMState(FSMState fsmState)
    {
       //容错处理
        if (fsmState  == null) return;
        //往字典里面添加FSM状态
        if (fsmStates.Count == 0)
        {
            fsmStates.Add(fsmState);
            currentState = fsmState;
            currentStateID = fsmState.ID ;
            return;
        }

        foreach (FSMState  state in fsmStates )
        {
            if (state.ID == fsmState.ID)
            {
                print("错误!");
                return;
            }
        }

        fsmStates.Add(fsmState);
    }

    /// 
    /// 删除FSM里面指定的状态
    /// 
    /// 
    public void DeleteState(FSMStateID fsmState)
    {
        //容错
        if (fsmState == FSMStateID.None) return;
        //删除
        foreach (FSMState  state in fsmStates )
        {
            fsmStates.Remove(state);
            return;
        }
    }
    /// 
    /// 执行状态转换
    /// 
    /// 
    public void PerformTransition(Transition  trans)
    {
        //容错处理
        if (trans == Transition.None)
            return;
        FSMStateID id = currentState.GetOutputState(trans);
        if (id == FSMStateID.None)
            return;
        //切换状态
        currentStateID = id;
        foreach (FSMState  state in fsmStates )
        {
            if (state.ID == currentStateID)
            {
                currentState = state;
                break;
            }
        }
    }
}


下面这个是人工智能(有限状态机)的所有行为的父类,不继承FSM类,但是会调用上面两个类的方法


using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// 
/// 用于切换状态的建
/// 
public enum Transition
{
    None = 0,
    SawPlayer,
    ReachPlayer,
    LostPlayer,
    NoHealth
}

/// 
/// 用于切换状态的值
/// 
public enum FSMStateID
{
    None = 0,
    Patrolling,
    Chasing,
    Attacking,
    Dead
}

public class AdvancedFSM : FSM
{
    //存储但前类的数组
    private List fsmStates;

    //当前状态的ID(值)
    private FSMStateID currentStateID;
    public FSMStateID CurrentStateID
    {
        get { return currentStateID; }
    }
    //当前状态
    private FSMState currentState;
    private FSMState CurrentState
    {
        get { return currentState; }
    }
    //构造方法,初始化
    public AdvancedFSM()
    {
        fsmStates = new List();
    }
    /// 
    /// 增加FSM状态
    /// 
    /// 
    public void AddFSMState(FSMState fsmState)
    {
       //容错处理
        if (fsmState  == null) return;
        //往字典里面添加FSM状态
        if (fsmStates.Count == 0)
        {
            fsmStates.Add(fsmState);
            currentState = fsmState;
            currentStateID = fsmState.ID ;
            return;
        }

        foreach (FSMState  state in fsmStates )
        {
            if (state.ID == fsmState.ID)
            {
                print("错误!");
                return;
            }
        }

        fsmStates.Add(fsmState);
    }

    /// 
    /// 删除FSM里面指定的状态
    /// 
    /// 
    public void DeleteState(FSMStateID fsmState)
    {
        //容错
        if (fsmState == FSMStateID.None) return;
        //删除
        foreach (FSMState  state in fsmStates )
        {
            fsmStates.Remove(state);
            return;
        }
    }
    /// 
    /// 执行状态转换
    /// 
    /// 
    public void PerformTransition(Transition  trans)
    {
        //容错处理
        if (trans == Transition.None)
            return;
        FSMStateID id = currentState.GetOutputState(trans);
        if (id == FSMStateID.None)
            return;
        //切换状态
        currentStateID = id;
        foreach (FSMState  state in fsmStates )
        {
            if (state.ID == currentStateID)
            {
                currentState = state;
                break;
            }
        }
    }
}

此篇结束

你可能感兴趣的:(Unity,FSM,unity3d,算法,架构)