obsidian/笔记文件/2.笔记/游戏中的AI算法_第五章.md
2025-03-26 00:02:56 +08:00

4.0 KiB
Raw Permalink Blame History

引用的命名空间

!Pasted image 20241004103551.png

对应Plan动作计划的Handler回调逻辑的接口其中包含布尔判断执行结果还有初始化、开始执行、下一动作、中断计划 还有获取当前Queue容器中最外层的动作Handler数据接口

!Pasted image 20240410160247.png

这是对应动作计划hanlder接口的实现逻辑其中声明了Plan数据Queue容器动作管理器、计划完成回调_onComplete 还有当前的动作Handler事件当前Plane计划是否已经被打断

!Pasted image 20240410160511.png

是否完成的获取器,通过打断的布尔判断 + plan计划判空 + 数据容器Count是否为0 + 当前 动作Handler事件的ExcuteState枚举状态是否等于EXIT这几个配合返回结果即可

!Pasted image 20240410160748.png

初始化,和添加完成回调

!Pasted image 20240410161036.png

如果已经完成调用对应回调即可否则从容器Dequeue出队数据作为当前动作Handler调用动作管理器的ExcuteNewState接口执行新动作即可 设置打断当前计划的是Interruptible接口 而获取当前动作Handler的。是GetCurrentHandler接口

!Pasted image 20240410161104.png

开始计划就是调用NextAction即可

!Pasted image 20240410173118.png

计划Plan的节点也有一个类去声明暂时用不上

!Pasted image 20240410165928.png

针对不同的动作,有几个枚举

!Pasted image 20240410170532.png

目标的

!Pasted image 20240410170552.png

行为

!Pasted image 20240410170617.png

继续

!Pasted image 20240410170641.png

判断是自身还是敌人,需要注意的是,相对于敌人来说,玩家是敌人

!Pasted image 20240410170711.png

回到触发器接口与之对应的实现抽象类是在同一个脚本文件其中声明了优先级会被触发的_effects状态还有对应触发器的_agent代理器 InitEffects是初始化触发后的结果在构造函数中被赋予_effects FrameFun是帧更新函数如果被触发的IsTrigger布尔为true就会调用调用触发结果Set修改State状态

!Pasted image 20240410170937.png

触发器的管理接口,其中只有一个帧函数声明

!Pasted image 20240410172317.png

对应的实现抽象类声明了代理_agent和触发器List容器

!Pasted image 20240410172406.png

FrameFun帧更新函数就是遍历所有的触发器调用其中的FrameFun帧更新函数即可 添加触发器的AddTrigger函数在添加完成后还会OrderByDescending降序重新排列确保 Priority优先级高的触发器在前面 初始化、添加触发器的 InitTriggers 抽象函数会在业务的逻辑中完成override重写

!Pasted image 20240410172441.png

Performer是基于之前提及的IPerformer接口的实现类 主要是用来关联,计划任务、目标、动作,三者管理器的逻辑;

!Pasted image 20241005112647.png

完成计划,还有完成动作的回调函数

!Pasted image 20241005112756.png

声明的plan计划、goal目标、action动作相关完成后的Complete回调都在传参代理agent的构造函数完成初始化

!Pasted image 20241005112854.png

当前goal目标传参通过BuildPlan完成计划的初始化后 遍历plan这个Queue容器完成Init初始化后调用Handler的StartPlan接口开始计划的动作行进同时回顾一下动作管理器的IsPerformAction布尔设置为true代表开始执行动作即可

!Pasted image 20240410173219.png

!Pasted image 20240410173414.png

调用PlanHandler的接口完成打断计划逻辑

!Pasted image 20240410173534.png

制定计划,进行下一步动作的接口

!Pasted image 20241005113328.png

Performer类更新数据的逻辑是判断当前计划是否完成再调用BuildPlanAndStart开启计划即可

!Pasted image 20240410173908.png