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
受击流程:
- 监听 Health 属性变化
- 受到伤害时:创建血条 UI、触发 Overlay Material 闪烁
- 死亡时:停止行为树、布娃娃物理、禁用碰撞、添加到尸体管理系统
- 通过
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)驱动伤害检测。
流程:
- 绑定 AnimInstance 的
OnMeleeOverlap委托 - 播放近战动画 Montage
- AnimNotifyState_Melee 在动画期间持续检测球形重叠
- 找到可伤害目标后应用一次伤害
- 动画结束后停止 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 发送给被发现的玩家