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

4.7 KiB
Raw Blame History

回到动作管理器JudgeInterruptibleHandler接口是遍历打断计划的动作然后调用计划执行Performer的打断接口Interruptible即可

!Pasted image 20240411113310.png

还有一个JudgeConformActionState接口是遍历动作状态字典拿到其中的先决条件Preconditions字段判断是否为当前代理状态集中有包含 如果包含再判断ActionExcuteState动作状态枚举是否满足切换条件调用ExcuteNewState切换即可

!Pasted image 20240411114014.png

动作管理器的更新数据函数,调用以上俩接口

!Pasted image 20240411114308.png

回到代理的基类接口,声明的剩余变量,分别是动作管理、目标管理、计划执行、还有帧函数

!Pasted image 20240411111542.png

对应的agentBase代理实现类其中声明了判断代理是否结束的布尔代理的状态动作和目标的映射map动作管理器、目标管理器、计划执行、触发器、游戏数据初始化的_onInitGameData回调暂时没使用到

!Pasted image 20240411111705.png

也声明了状态、映射、动作管理、目标管理、触发器管理、Debug信息的抽象初始化函数在具体业务逻辑中再完成重写

!Pasted image 20240411114444.png

代理判空

!Pasted image 20240411114552.png

代理的数据更新,还有帧函数,也是调用各管理器对应的接口

!Pasted image 20240411114620.png

构造函数,初始化完成之后,调用判空逻辑

!Pasted image 20240411114647.png

以上就是框架相关后面就开始解析和使用GOAP框架 先拿到这个基础的逻辑挂载节点;

!Pasted image 20240411161901.png

这是对应的具体逻辑,完成玩家和敌人的实体绑定,方便后续调用

!Pasted image 20240411161936.png

玩家挂载的,逻辑根节点

!Pasted image 20240411121809.png

是调用了PlayerAgent这个玩家代理Start函数完成初始化FixUpdate调用对应的帧函数即可

!Pasted image 20240411121928.png

注意修改动作管理类中是abstract抽象方法后续在子类中完成功能重写

!Pasted image 20241005170826.png

对应玩家的脚本,都放在同一文件夹内

!Pasted image 20240411155936.png

这是玩家的动作管理器相关逻辑默认动作标签是IDLE可以被触发的动作是LOOK_AT看向

!Pasted image 20240411160726.png

玩家的目标管理器,只是简单继承,和重写初始化,没有具体的目标

!Pasted image 20240411161638.png

玩家的映射,是把 LookAtActionState 看向的状态和LookAtStateHandler 看向的动作事件Handler绑定起来初始化函数里设置游戏数据相关设置自身是Player敌人是Enemy

!Pasted image 20240411161735.png

检查一下Action基类中对应声明的是抽象变量

!Pasted image 20241005171911.png

这是看向的角色状态对应的具体逻辑是继承自动作基类其中先决条件初始化InitPreconditions设定触发的先决条件是 FIND_ENEMY 找到敌人这个状态为true 而该动作状态的后续影响InitEffects初始化就是 FIND_ENEMY 为false即可 需要注意的是,后续敌人也会用到这个逻辑,这是框架,逻辑复用的优点;

!Pasted image 20240411162446.png

检查一下ActionHandler基类中对应各逻辑切换函数是虚函数子类可重写

!Pasted image 20241005172601.png

这是对应绑定“看向”这个动作状态的Handler动作事件逻辑Enter就是进入动作的逻辑处理从映射map中拿到自身self和enemy对应的实体完成赋值 Execute函数是动作执行过程中调用的函数也就是帧更新函数会调用的逻辑就是调用了Transform内置的LookAt函数即可 后续敌人也会用到这个逻辑,这也是框架,逻辑复用的优点;

!Pasted image 20240411162917.png

帧函数FrameFun的引用

!Pasted image 20240411163122.png

Unity的Transform内置LookAt

!Pasted image 20240411163305.png

对应的玩家代理其中的debug打log显示用之前解析过的CustomDebug即可 初始化代理状态的逻辑也是其他状态设置为false把IDLE默认状态设置为true即可

!Pasted image 20240411162133.png

完成其余玩家映射map、玩家动作管理器、触发器管理类的初始化即可 需要注意的是这里触发器用了默认的CustomTriggerMgr后续会跟敌人使用相同的管理器这也是框架逻辑复用的优点之一

!Pasted image 20240411162246.png

上述调用的CustomTriggerMgr触发器管理类相关逻辑后续会解析