You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:36:06