AI 系统

概述

AI 系统负责管理游戏中的敌方角色(怪物),包括角色定义、AI 控制器、行为树节点以及 AI 专用的 Action。系统使用 UE 的行为树(Behavior Tree)、感知系统(AI Perception)和环境查询系统(EQS)实现智能 AI 行为。

核心类

ARogueAICharacter

文件: Source/ActionRoguelike/AI/RogueAICharacter.h/.cpp

AI 角色的基类,继承自 ACharacter,实现了多个接口:

  • IGenericTeamAgentInterface - 队伍系统(TEAM_ID_BOTS = 1)
  • IRogueSignificanceInterface - 性能优化的重要性管理
  • IRogueActionSystemInterface - 统一的 ActionComponent 访问

性能优化亮点

  • 使用 USkeletalMeshComponentBudgeted 替代标准骨骼网格,支持动画预算分配
  • 注册 Significance Manager 进行距离敏感的 LOD 管理
  • 远距离切换为 MOVE_NavWalking(比标准 Walking 更高效)
  • bUpdateOverlapsOnAnimationFinalize = false 跳过动画后的重叠查询
  • VisibilityBasedAnimTickOption::OnlyTickMontagesWhenNotRendered 不可见时仅 Tick Montage

受击流程

  1. 监听 Health 属性变化
  2. 受到伤害时:创建血条 UI、触发 Overlay Material 闪烁
  3. 死亡时:停止行为树、布娃娃物理、禁用碰撞、添加到尸体管理系统
  4. 通过 UAISense_Damage::ReportDamageEvent 报告伤害事件给感知系统

ARogueAIController

文件: Source/ActionRoguelike/AI/RogueAIController.h/.cpp

AI 控制器,负责运行行为树并管理感知。

特性

  • 内置 UAIPerceptionComponent 感知组件
  • BeginPlay 时自动运行配置的行为树
  • 监听黑板 TargetActor 键变化,当首次发现玩家时通知玩家(“被发现"UI 提示)
  • PreRegisterAllComponents 中设置 TeamID,确保感知系统正确注册

行为树节点

URogueBTTask_StartAction

通过 GameplayTag 启动 AI 角色的 Action,是 AI 使用 Action System 的桥梁。

URogueBTTask_HealSelf

自我治疗任务,将 Health 恢复到 HealthMax。

URogueBTService_CheckAttackRange

定期检查目标是否在攻击范围内且有视线(LineOfSight)。

  • 支持使用 Deferred Task System 异步执行视线检查
  • 支持通过 CVar game.drawdebugattackrange 开启调试渲染

URogueBTService_StartAction

以 Service 方式持续尝试启动某个 Action(每次 Tick 都尝试)。

URogueBTDecorator_CheckHealth

检查 AI 当前生命值是否低于阈值(默认 30%),用于触发自我治疗行为。

UDEPRECATED_URogueBTTask_RangedAttack

已弃用的远程攻击任务,被 Action System 方案替代。

AI 专用 Action

URogueAction_MinionRangedAttack

AI 远程攻击 Action,使用 SuggestProjectileVelocity_MovingTarget 预测目标移动进行瞄准。

智能瞄准

  • 根据弹体速度和目标距离计算飞行时间
  • 处理重力弹道计算
  • 添加随机偏差模拟瞄准不精确
  • 同时支持 Actor 和 数据导向弹体系统

URogueAction_MinionMeleeAttack

AI 近战攻击 Action,通过动画通知(AnimNotify)驱动伤害检测。

流程

  1. 绑定 AnimInstance 的 OnMeleeOverlap 委托
  2. 播放近战动画 Montage
  3. AnimNotifyState_Melee 在动画期间持续检测球形重叠
  4. 找到可伤害目标后应用一次伤害
  5. 动画结束后停止 Action

URogueQueryContext_TargetActor

文件: Source/ActionRoguelike/AI/RogueQueryContext_TargetActor.h/.cpp

EQS 查询上下文,从 AI 的黑板获取 TargetActor,供环境查询使用。

AI 架构图

ARogueAIController
  ├── UAIPerceptionComponent(感知:视觉、伤害)
  ├── UBehaviorTree(行为树)
  │     ├── Service: CheckAttackRange(检查攻击距离 + 视线)
  │     ├── Decorator: CheckHealth(低血量判断)
  │     ├── Task: StartAction(触发攻击 Action)
  │     └── Task: HealSelf(自我治疗)
  └── UBlackboardComponent
        └── TargetActor(感知到的目标)

ARogueAICharacter
  ├── URogueActionComponent(Actions + Attributes)
  │     ├── MinionRangedAttack(远程攻击)
  │     ├── MinionMeleeAttack(近战攻击)
  │     └── MonsterAttributeSet(Health, AttackDamage, MoveSpeed)
  ├── USkeletalMeshComponentBudgeted(预算动画系统)
  ├── UAudioComponent(攻击音效)
  └── UNiagaraComponent(攻击粒子)

网络注意事项

  • AI 逻辑(行为树、感知)仅在服务端运行
  • 视觉效果通过 MulticastPlayAttackFX() 同步到所有客户端
  • “被发现"通知通过 ClientOnSeenBy() Client RPC 发送给被发现的玩家