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

本文深入探讨了Unity3D中有限状态机的使用,包括其核心父类的设计、子类的扩展以及行为类的实现。通过详细分析源码,阐述了如何构建和管理游戏AI的行为流程,特别强调了状态转换、状态存储与执行过程。旨在为游戏开发者提供一种高效实现复杂角色行为的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">以下内容参照《unity3d 人工智能编程》--Aung Sithu Kyaw,Clifford Peters ,Thet Naing Swe编著</span>

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

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

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

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


父类:


using UnityEngine;
using System.Collections;

/// <summary>
/// 状态机父类
/// </summary>
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<Rigidbody>();
        //pointList = new GameObject[GameObject.FindGameObjectsWithTag("WandarPoint").Length];

    }

    void Update()
    {
        FSMUpdate();
    }

    void FixedUpdate()
    {
        FSMFixedUpdate();
    }

   
}


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


然后是继承它的子类

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

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

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

public class AdvancedFSM : FSM
{
    //存储但前类的数组
    private List<FSMState> 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<FSMState>();
    }
    /// <summary>
    /// 增加FSM状态
    /// </summary>
    /// <param name="fsmState"></param>
    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);
    }

    /// <summary>
    /// 删除FSM里面指定的状态
    /// </summary>
    /// <param name="fsmState"></param>
    public void DeleteState(FSMStateID fsmState)
    {
        //容错
        if (fsmState == FSMStateID.None) return;
        //删除
        foreach (FSMState  state in fsmStates )
        {
            fsmStates.Remove(state);
            return;
        }
    }
    /// <summary>
    /// 执行状态转换
    /// </summary>
    /// <param name="trans"></param>
    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;

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

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

public class AdvancedFSM : FSM
{
    //存储但前类的数组
    private List<FSMState> 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<FSMState>();
    }
    /// <summary>
    /// 增加FSM状态
    /// </summary>
    /// <param name="fsmState"></param>
    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);
    }

    /// <summary>
    /// 删除FSM里面指定的状态
    /// </summary>
    /// <param name="fsmState"></param>
    public void DeleteState(FSMStateID fsmState)
    {
        //容错
        if (fsmState == FSMStateID.None) return;
        //删除
        foreach (FSMState  state in fsmStates )
        {
            fsmStates.Remove(state);
            return;
        }
    }
    /// <summary>
    /// 执行状态转换
    /// </summary>
    /// <param name="trans"></param>
    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;
            }
        }
    }
}

此篇结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值