UE4 C++ 如何实现AI丢失玩家视野后停止跟随并返回基础路径
问题原因
你目前的实现仅在AI检测到玩家时给黑板变量赋值了追踪目标,没有处理丢失玩家视野的清空逻辑,导致行为树始终能读取到有效追踪目标,所以AI会一直保持跟随状态,不会切回巡逻逻辑。
修复步骤
1. 绑定丢失视野回调
UPawnSensingComponent 自带OnPawnNotSeen委托,用于触发目标离开视野后的逻辑,你需要补充绑定这个回调:
首先在AAICharacter的头文件中声明回调函数:
UFUNCTION() void OnPawnLostSight(APawn* InPawn);
修改AAICharacter::BeginPlay的绑定逻辑:
void AAICharacter::BeginPlay() { Super::BeginPlay(); if (PawnSensingComp) { PawnSensingComp->OnSeePawn.AddDynamic(this, &AAICharacter::OnSeePlayer); // 新增绑定丢失视野回调 PawnSensingComp->OnPawnNotSeen.AddDynamic(this, &AAICharacter::OnPawnLostSight); // 可选:调整视野检测半径、检测间隔,适配你的需求 PawnSensingComp->VisionRadius = 1000.f; PawnSensingComp->SensingInterval = 0.5f; } }
实现丢失视野的回调函数:
void AAICharacter::OnPawnLostSight(APawn* InPawn) { AMyAIController1* AIController = Cast<AMyAIController1>(GetController()); // 仅当丢失的是当前追踪的目标时才执行清空 if (AIController && InPawn == AIController->GetSeenTarget()) { AIController->ClearSeenTarget(); } }
2. 补充清空黑板目标的方法
在AMyAIController1类中新增ClearSeenTarget方法,用于清空黑板的追踪目标变量:
void AMyAIController1::ClearSeenTarget() { if (BlackboardComp) { BlackboardComp->SetValueAsObject(BlackboardKey, nullptr); } }
3. 调整行为树逻辑
给跟随分支的根节点加黑板值校验装饰器:判断追踪目标的黑板key是否为非空,当值为空时自动终止跟随分支,执行巡逻分支即可。
可选优化
如果需要避免玩家短暂被遮挡就立刻切回巡逻,可以加个丢失延迟:在OnPawnLostSight触发时不立刻清空黑板,而是启动一个计时器,若计时器结束前没有重新检测到玩家,再执行清空操作。
内容的提问来源于stack exchange,提问作者gajeel redfox
相关产品推荐
相关产品推荐

