Unity有限状态机实现怪物AI(代码框架思路)

目录

状态的枚举

状态基类

接口(规范不同对象的同一行为)

 状态机类(作为媒介用于管理各个状态之间的转换)

附带一个攻击状态的子类脚本作为示例:


状态的枚举

首先最容易想到的是状态的枚举,比如说攻击状态、巡逻状态、追击状态等等,用枚举进行表示

public enum E_AI_State 
{
    /// <summary>
    /// 睡眠状态
    /// </summary>
    Sleep,
    /// <summary>
    /// 巡逻状态
    /// </summary>
    Patrol,
    /// <summary>
    /// 聊天状态
    /// </summary>
    Chat,
    /// <summary>
    /// 逃跑状态
    /// </summary>
    Run,
    /// <summary>
    /// 追逐玩家状态
    /// </summary>
    Chase,
    /// <summary>
    /// 攻击玩家的状态
    /// </summary>
    Atk,
    /// <summary>
    /// 警觉状态
    /// </summary>
    Alertness,
}

状态基类

再就是所有怪物 对应的状态都会有一个 脚本去控制该状态下该执行什么,而这些状态肯定会有一部分的逻辑是相同的,所以可以提取出一个抽象类,即状态基类

public abstract class BaseState
{
    //有限状态机实现的AI中的 这些 状态类 它的本质 对于我们来说 是在做什么?
    //逻辑处理(不仅仅是做AI,不管你用代码做什么样的事情 都是在进行逻辑处理)

    //AI状态的切换 
    //切换这个词 就意味着
    // 状态1 ——> 状态2

    //在这个基类中 可以去实现所有状态共有的 进入、离开、处于状态的行为(函数、方法)
    //但是这些方法中 由于是基类,没有明确是哪种状态,也就意味着方法中不会写内容
    //那么 不能写内容的函数 你能联想到什么?
    //1.如果是接口 ,那么直接声明
    //2.如果是类,那么可以考虑抽象方法——一定是抽象类

    //管理自己的有限状态机对象
    protected StateMachine stateMachine;


    /// <summary>
    /// 初始化状态类时  将管理者传入 进行记录
    /// </summary>
    /// <param name="machine"></param>
    public BaseState(StateMachine machine)
    {
        stateMachine = machine;
    }

    //当前状态的类型
    public virtual E_AI_State AIState
    {
        get;
    }


    // 1.离开状态时 做什么
    public abstract void QuitState();

    // 2.进入状态时 做什么
    public abstract void EnterState();

    // 3.处于状态时 做什么(核心逻辑处理)
    public abstract void UpdateState();
}

接口(规范不同对象的同一行为)

public interface IAIObj 
{
    //所有AI对象都应该可以获取到它的Transform信息
    public Transform objTransform
    {
        get;
    }

    //所有AI对象都应该有一个当前的位置
    public Vector3 nowPos
    {
        get;
    }

    //AI对象的目标对象所在的位置
    public Vector3 targetObjPos
    {
        get;
    }

    //所有AI对象都应该有一个攻击范围的概念
    //好用于判断 什么时候开始攻击玩家
    public float atkRange
    {
        get;
    }

    //出生位置 需要
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值