游戏中的AI算法_第七章
有一个触发器,构造函数,也是跟之前解析的,动作状态 LookAtState 和 动作逻辑事件 LookAtHandler 的类似,完成self 和 enemy 的实体赋值; 优先级只是get获取,默认为0;
是否触发的IsTrigger布尔重写,包含具体的业务逻辑,如果self和enemy两者实体,距离小于5,就会旋转,让两者确认面对面
这个布尔判断,是在帧函数调用的,所以是每一帧都会更新,让两者确保一直面对面
该触发器,对应的后续影响,就是设置 FIND_ENEMY 状态为true即可
解析的,玩家Agent代理,使用的触发器,是CustomTriggerMgr,默认触发器管理类,这是对应的具体逻辑,其中,初始化 触发器的逻辑重写,就是把 TriggerEyes面对面 这个触发器,通过 AddTrigger接口,完成添加即可; 后续敌人也会使用,CustomTriggerMgr,默认触发器,业务表现上,就是敌人和玩家,因为使用了相同的触发器逻辑,所以两者,都会保持面对面;
再看敌人身上,挂载的逻辑脚本
对应的具体逻辑,其中agent代理,使用的是CustomAgent 默认代理器,帧更新函数FixedUpdate中,调用的也是代理agent的FrameFun帧函数
默认代理器CustomAgent,其中的状态初始化,也是设置为IDLE默认状态为true,其他都是false
这是默认的,动作管理器; 其中初始化,添加动作Handler事件,都是通过AddActionHandler添加即可,而且其中的ActionEnum枚举,对应的都是动作Action相关多; 而初始化,添加动作状态Handler,就是使用AddActionStateHandler接口即可,这里绑定的Action和Handler,有:Attack攻击、Alert警戒、Injure受伤、Move移动、Attack_IDLE攻击默认状态; 这里的动作状态,是LOOK_AT,对应的是ActionState,前面解析,会被TriggerEye触发器,进行触发; 而默认的动作标签,是ALERT警告;
警戒对应的动作Action,具体逻辑,先决条件,是FIND_ENEMY为false,没有找到敌人的时候,才会警戒; 而触发警戒的后续影响,是CAN_MOVE为true,逻辑上,是会触发,实体是可移动的Move对应的Action动作;
Alert的动作Action,对应的Handler事件逻辑,其中只有一个Enter和Exit的重写,也是打log作为测试记录
刚提及的,警戒Alert的Effect后续影响,会触发的MoveAction移动动作,先决条件也是CAN_MOVE为true,而它的Effect后续影响,是临近敌人的NEAR_ENEMY和 移动CAN_MOVE为false即可
而移动Action对应的,移动Handler动作事件,除了self和enemy的赋值,还有使用了,unity内置的角色控制器CharacterController,和移动速度speed,都是在Enter里,完成初始化和赋值
对应敌人身上挂载的
移动中,调用的Execute逻辑,是对应了具体的,业务逻辑,根据敌人和自身的距离判断,调用CharacterController角色控制器的SimpleMove接口,完成移动即可; 退出移动状态,也是打印一个log就好