1.1 请详细描述UE中AI Controller的角色,以及从Pawn生成到AI行为执行的完整控制流程。AI Controller与Player Controller有何异同?
★★ 中等考点: AI Controller生命周期、Possess机制、Controller与Pawn的关系、AI架构设计
参考答案:
AAIController继承自AController,负责"思考"和"决策",Pawn 负责"物理存在"。- 完整控制流程:
GameMode::SpawnDefaultPawnAtTransform()生成 Pawn;GameMode::SpawnDefaultControllerFor()生成 AIController(由 Pawn 的AIControllerClass决定);AIController::Possess(Pawn)建立绑定,触发OnPossess();OnPossess()中UseBlackboard()+RunBehaviorTree()启动行为树;- 每帧 Tick → 行为树求值 → 执行 Task → 更新黑板。
- 关键代码:
void AMyAIController::OnPossess(APawn* InPawn)
{
Super::OnPossess(InPawn);
if (UseBlackboard(BlackboardAsset, BlackboardComp))
{
BlackboardComp->SetValueAsVector(TEXT("HomeLocation"), InPawn->GetActorLocation());
BlackboardComp->SetValueAsObject(TEXT("SelfActor"), InPawn);
}
if (BehaviorTreeAsset)
{
RunBehaviorTree(BehaviorTreeAsset);
}
}
void AMyAIController::OnUnPossess()
{
Super::OnUnPossess();
if (UBrainComponent* BrainComp = GetBrainComponent())
{
BrainComp->StopLogic("Unpossessed"); // 暂停行为树
}
}- 与 PlayerController 对比:
| 特性 | AIController | PlayerController |
|---|---|---|
| 输入来源 | 行为树/EQS/自定义逻辑 | PlayerInput组件 |
| 网络角色 | 仅服务端运行 | 客户端拥有 |
| 决策机制 | BrainComponent(行为树) | 玩家输入/UI |
| 数量 | 每个AI Pawn一个 | 每个玩家一个 |
| Tick频率 | 可配置(间隔Tick优化) | 通常每帧 |
- 易错点/进阶:理解
BrainComponent抽象(行为树/Logic树等多实现);运行时可用RunBehaviorTree(NewTree)动态切换;感知组件通常挂在 AIController 而非 Pawn 上。