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

3.9 KiB
Raw Permalink Blame History

有一个触发器,构造函数,也是跟之前解析的,动作状态 LookAtState 和 动作逻辑事件 LookAtHandler 的类似完成self 和 enemy 的实体赋值; 优先级只是get获取默认为0

!Pasted image 20240411172354.png

!Pasted image 20240411172953.png

是否触发的IsTrigger布尔重写包含具体的业务逻辑如果self和enemy两者实体距离小于5就会旋转让两者确认面对面

!Pasted image 20240411173027.png

这个布尔判断,是在帧函数调用的,所以是每一帧都会更新,让两者确保一直面对面

!Pasted image 20240411173216.png

该触发器,对应的后续影响,就是设置 FIND_ENEMY 状态为true即可

!Pasted image 20240411173133.png

触发器管理相关的,抽象父类中,完成构造函数

!Pasted image 20241007161706.png

解析的玩家Agent代理使用的触发器是CustomTriggerMgr默认触发器管理类这是对应的具体逻辑其中初始化 触发器的逻辑重写,就是把 TriggerEyes面对面 这个触发器,通过 AddTrigger接口完成添加即可 后续敌人也会使用CustomTriggerMgr默认触发器业务表现上就是敌人和玩家因为使用了相同的触发器逻辑所以两者都会保持面对面

!Pasted image 20240411173321.png

再看敌人身上,挂载的逻辑脚本

!Pasted image 20240411173804.png

对应的具体逻辑其中agent代理使用的是CustomAgent 默认代理器帧更新函数FixedUpdate中调用的也是代理agent的FrameFun帧函数

!Pasted image 20240411173824.png

补充一下其中调用的UnityTrigger触发器包含添加碰撞器callback函数还有OnTriggerEnter触发器的Unity内置函数

!Pasted image 20241007170603.png

默认代理器CustomAgent其中的状态初始化也是设置为IDLE默认状态为true其他都是false

!Pasted image 20240411173941.png

这是默认的,动作管理器; 其中初始化添加动作Handler事件都是通过AddActionHandler添加即可而且其中的ActionEnum枚举对应的都是动作Action相关多 而初始化添加动作状态Handler就是使用AddActionStateHandler接口即可这里绑定的Action和HandlerAttack攻击、Alert警戒、Injure受伤、Move移动、Attack_IDLE攻击默认状态 这里的动作状态是LOOK_AT对应的是ActionState前面解析会被TriggerEye触发器进行触发 而默认的动作标签是ALERT警告

!Pasted image 20240411174145.png

!Pasted image 20240411174341.png

警戒对应的动作Action具体逻辑先决条件是FIND_ENEMY为false没有找到敌人的时候才会警戒 而触发警戒的后续影响是CAN_MOVE为true逻辑上是会触发实体是可移动的Move对应的Action动作

!Pasted image 20240411174502.png

Alert的动作Action对应的Handler事件逻辑其中只有一个Enter和Exit的重写也是打log作为测试记录

!Pasted image 20240411174658.png

刚提及的警戒Alert的Effect后续影响会触发的MoveAction移动动作先决条件也是CAN_MOVE为true而它的Effect后续影响是临近敌人的NEAR_ENEMY和 移动CAN_MOVE为false即可

!Pasted image 20240411174741.png

而移动Action对应的移动Handler动作事件除了self和enemy的赋值还有使用了unity内置的角色控制器CharacterController和移动速度speed都是在Enter里完成初始化和赋值

!Pasted image 20240411175147.png

对应敌人身上挂载的

!Pasted image 20240411175517.png

移动中调用的Execute逻辑是对应了具体的业务逻辑根据敌人和自身的距离判断调用CharacterController角色控制器的SimpleMove接口完成移动即可 退出移动状态也是打印一个log就好

!Pasted image 20240415112149.png