目录
状态的枚举
首先最容易想到的是状态的枚举,比如说攻击状态、巡逻状态、追击状态等等,用枚举进行表示
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;
}
//出生位置 需要