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

4.7 KiB
Raw Permalink Blame History

动作状态机,动作状态 状态机的初始化函数也是分别从对应的字典容器提取数据放到对应的fsm状态机即可

!Pasted image 20240829131726.png

初始化打断当前计划的handler队列容器也是遍历动作字典容器如果其中的动作事件对应的Action动作的布尔CanInterruptiblePlan字段为true就说明是可被打断的加到队列容器即可 可打断的handler也会有优先级区别使用OrderByDescending降序基于动作优先级Priority重新排序即可参考LINQ使用Orderby、ThenBy实现多字段的排序

!Pasted image 20240410130412.png

!Pasted image 20240410130644.png

还有两个抽象函数分别是初始化当前代理agent处理的动作还有当前可叠加的

!Pasted image 20240410130831.png

动作管理的构造函数,对声明的各个变量,完成初始化,再调用之前解析的,各个初始化函数即可

!Pasted image 20240410130945.png

添加动作事件Handler的接口是通过agent代理的映射map字段的接口通过label标签提取即可 handler的完成回调是通过lambda表达式调用管理器的完成回调_onActionComplete即可

!Pasted image 20240410164947.png

调用上述接口,分别是动作状态机字典,还有动作状态 状态机字典

!Pasted image 20240410165255.png

移除和获取,动作字典相关接口

!Pasted image 20240410165353.png

管理器的,帧更新函数,也是分别调用,两个状态机的帧更新函数

!Pasted image 20240410165434.png

通过两个状态机,也是遍历 动作字典 、动作状态字典调用新状态ExcuteNewState接口 还有添加完成回调的AddActionCompleteListener函数接口逻辑

!Pasted image 20240410165627.png

ActionBase动作的抽象基类继承和实现IAction动作接口声明了标签、动作消耗、优先级、动作是否可以被打断的布尔作为先决条件的状态执行之后的状态还有当前agent代理

!Pasted image 20240410131519.png

对先决条件、后续影响的初始化还有先决条件的验证就是通过state的ContainState接口判断在_dataTable数据容器中是否包含状态即可

!Pasted image 20240410131827.png

!Pasted image 20240829164647.png

回到ActionBase类声明一个布尔判断当前动作是否可以被中断 再写一个构造函数,调用上述函数逻辑,完成初始化即可;

!Pasted image 20240829164835.png

回到IGoal目标基类接口除了之前解析的还有其余函数接口声明会在后续实现

!Pasted image 20240410132703.png

目标GaolBase抽象基类继承自IGoal目标接口声明了目标对应的后续影响、激活生效条件、目标代理、生效回调_onActivate失效回调_onInactivate还有标签Label

!Pasted image 20240410132053.png

其余函数接口:获取目标优先级、后续影响、激活条件; 还有初始化后续影响、激活条件; 是否已实现目标的逻辑就是检测代理agent对应的状态中是否包含后续影响effects即可

!Pasted image 20240410132321.png

添加激活回调_onActivate和失效回调_onInactivate的函数接口 还有更新函数接口的逻辑实现通过ActiveCondition激活函数返回的布尔判断是调用_onActivate还是调用_onInactivate即可 需要注意的是目标代理agent对应的AgentState代理状态是包含了激活条件_activeCondition还有后续影响_effects的

!Pasted image 20240410132919.png

!Pasted image 20240410132812.png

构造函数,完成传参赋值,调用初始化函数即可

!Pasted image 20240410133217.png

目标管理的基类接口,包含 当前目标、添加/移除 目标,寻找目标,更新目标相关数据信息 几个声明

!Pasted image 20240410133253.png

目标管理的抽象实现类声明了目标字典容器用来存储所有目标、还有对应的agent代理当前目标CurrentGoal再整一个队列容器_activeGoals存储当前激活的目标

!Pasted image 20240410133421.png

初始化目标相关,是一个等待实现的抽象函数

!Pasted image 20240410133542.png

添加和移除目标分别是基于代理的映射Maps通过label标签拿到目标然后加到_goalsDic字典容器 通过AddGoalActivateListener完成激活回调_onActivate的逻辑对应了当前激活目标队列_activeGoals的add添加 而失效回调_onInactivate的逻辑就是对应了_activeGoals的remove移除了 移除目标逻辑就相对简单从_goalsDic移除remove即可

!Pasted image 20240410133624.png