游戏中的AI算法_第五章
对应Plan动作计划的Handler回调逻辑的接口,其中包含布尔判断,执行结果,还有初始化、开始执行、下一动作、中断计划; 还有获取当前Queue容器中,最外层的动作Handler数据接口;
这是对应动作计划hanlder接口的,实现逻辑,其中声明了Plan数据Queue容器,动作管理器、计划完成回调_onComplete; 还有当前的动作Handler事件,当前Plane计划是否已经被打断;
是否完成的获取器,通过打断的布尔判断 + plan计划判空 + 数据容器Count是否为0 + 当前 动作Handler事件的ExcuteState枚举状态,是否等于EXIT,这几个配合返回结果即可
初始化,和添加完成回调
如果已经完成,调用对应回调即可,否则,从容器Dequeue出队数据,作为当前动作Handler,调用动作管理器的ExcuteNewState接口,执行新动作即可; 设置,打断当前计划的,是Interruptible接口; 而获取,当前动作Handler的。是GetCurrentHandler接口;
开始计划,就是调用NextAction即可
计划Plan的节点,也有一个类去声明,暂时用不上
针对不同的动作,有几个枚举
目标的
行为
继续
判断是自身还是敌人,需要注意的是,相对于敌人来说,玩家是敌人
回到触发器接口,与之对应的实现抽象类,是在同一个脚本文件,其中声明了优先级,会被触发的_effects状态,还有对应触发器的_agent代理器; InitEffects是初始化,触发后的结果,在构造函数中,被赋予_effects; FrameFun是帧更新函数,如果被触发的IsTrigger布尔为true,就会调用调用触发结果,Set修改State状态;
触发器的管理接口,其中只有一个帧函数声明
对应的实现抽象类,声明了代理_agent和触发器List容器
FrameFun帧更新函数,就是遍历所有的触发器,调用其中的FrameFun帧更新函数即可; 添加触发器的AddTrigger函数,在添加完成后,还会OrderByDescending降序,重新排列,确保 Priority优先级高的触发器,在前面; 初始化、添加触发器的 InitTriggers 抽象函数,会在业务的逻辑中,完成override重写;
Performer是基于之前提及的IPerformer接口的,实现类; 主要是用来关联,计划任务、目标、动作,三者管理器的逻辑; 声明的plan计划、goal目标、action动作相关,都在传参代理agent的,构造函数,完成初始化;
当前goal目标传参,通过BuildPlan完成计划的初始化后; 遍历plan这个Queue容器,完成Init初始化后,调用Handler的StartPlan接口,开始计划的动作行进,同时回顾一下,动作管理器的,IsPerformAction布尔设置为true,代表,开始执行动作即可;
调用PlanHandler的接口,完成打断计划逻辑
完成计划的几个接口逻辑,分别是修改布尔,和进行下一步动作
需要注意的是,回顾一下,调用下一动作的逻辑,在构造函数的逻辑,被注册到,动作管理器的,完成回调中
Performer类,更新数据的逻辑,是判断当前计划是否完成,再调用BuildPlanAndStart开启计划即可