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

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

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

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

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

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

代理判空

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

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

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

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

玩家挂载的,逻辑根节点

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

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

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

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

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

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

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

帧函数FrameFun的引用

Unity的Transform内置LookAt

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

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