小桐桐Tong 2026-01-22 21:48 采纳率: 28.6%
浏览 1

虚幻5.7AImoveto节点

我在用行为树驱动ai追逐玩家的时候 当ai离玩家较劲的时候ai会降低速度追逐 这是为什么 我该怎么修正呢 谢谢

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-22 21:49
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在使用 Unreal Engine 5.7行为树(Behavior Tree)AI 控制器(AI Controller) 驱动 AI 追逐玩家时,如果发现 AI 在靠近玩家时速度降低,这通常是由于以下原因造成的:


    🚨 问题原因分析

    1. Move To 节点的 Stopping Distance 设置不当

      • 当 AI 接近目标(如玩家)时,如果设置了过小的 Stopping Distance,AI 会提前减速并停止。
      • 如果这个距离太小,AI 可能会在还没到达目标前就开始减速。
    2. Move To 节点的 Acceptable Radius 设置不合理

      • 如果 AI 与目标的距离小于该半径,AI 会认为已经“到达”目标,从而停止移动。
    3. AI 速度控制逻辑被其他节点干扰

      • 比如:在行为树中可能有其他节点(如 WaitSet Movement Speed)影响了 AI 的速度。
    4. AI 本身的速度设置问题

      • AI 的 Movement SpeedNavigation Speed 设置过低,导致即使没有减速,也会显得“慢”。

    ✅ 解决方案

    以下是详细的解决步骤,建议按顺序执行:

    1. 检查 Move To 节点的参数

    • 打开你的行为树,找到 Move To 节点。
    • 确保以下参数设置合理:
      • Target:应指向玩家或目标位置。
      • Stopping Distance:建议设为 0.5 ~ 1.0(根据你的场景调整)。
      • Acceptable Radius:建议设为 0.5 ~ 1.0
      • Use Navigation System:勾选(确保 AI 使用导航系统)。
      • Keep Moving:可选,若希望 AI 继续移动(比如绕圈),可启用。

    重点: Stopping DistanceAcceptable Radius 是关键参数,请不要设置得过小,否则 AI 会提前减速甚至停止。


    2. 检查 AI 控制器中的速度控制逻辑

    • 在 AI 控制器中,检查是否有以下逻辑:
      • Set Movement Speed
      • Set Target Velocity
      • Set Acceleration

    重点: 如果你在 AI 控制器中手动设置了速度,可能会覆盖 Move To 节点的默认行为。可以尝试注释掉这些代码,看看是否解决问题。


    3. 检查 AI 的 Nav Mesh 设置

    • 确保 AI 的导航网格(Nav Mesh)正确生成。
    • 如果 AI 无法准确找到路径,它可能会频繁改变方向或减速。

    4. 添加调试输出

    • 在行为树中添加 Print String 节点,输出 AI 与玩家之间的距离。
    • 例如:
      FVector PlayerLocation = Player->GetActorLocation();
      FVector AILocation = GetPawn()->GetActorLocation();
      float Distance = (PlayerLocation - AILocation).Size();
      UE_LOG(LogTemp, Warning, TEXT("Distance to Player: %f"), Distance);
      

    重点: 通过调试信息,你可以确认 AI 是否真的在接近玩家时开始减速,还是因为其他原因(如路径受阻)。


    5. 修改 Move To 节点的逻辑(可选)

    如果你希望 AI 即使在近距离也能继续移动(如贴身战斗),可以修改 Move To 节点的逻辑。例如,在 C++ 中自定义一个 BTTask_MoveTo 类:

    // MyBTTask_MoveTo.h
    #pragma once
    
    #include "BehaviorTree/Tasks/BTTask_MoveTo.h"
    #include "MyBTTask_MoveTo.generated.h"
    
    UCLASS()
    class MYPROJECT_API UMyBTTask_MoveTo : public UBTTask_MoveTo
    {
        GENERATED_BODY()
    
    public:
        virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;
    };
    
    // MyBTTask_MoveTo.cpp
    #include "MyBTTask_MoveTo.h"
    #include "GameFramework/Pawn.h"
    #include "Engine/World.h"
    
    EBTNodeResult::Type UMyBTTask_MoveTo::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
    {
        APawn* Pawn = Cast<APawn>(OwnerComp.GetAIPerceptionSystem()->GetAIOwner());
        if (!Pawn)
            return EBTNodeResult::Failed;
    
        FVector TargetLocation = GetTargetLocation(OwnerComp);
        if (TargetLocation.IsZero())
            return EBTNodeResult::Failed;
    
        // 强制 AI 移动到目标位置,不考虑 stopping distance
        Pawn->GetController()->MoveToLocation(TargetLocation);
    
        return EBTNodeResult::InProgress;
    }
    

    然后在行为树中使用这个自定义的 Move To 节点。


    ✅ 总结

    | 问题 | 原因 | 解决方案 | |------|------|----------| | AI 追逐玩家时减速 | Move To 节点的 Stopping DistanceAcceptable Radius 设置过小 | 调整这两个参数为合理值 | | AI 速度异常 | AI 控制器中手动设置了速度 | 检查并移除或修改相关逻辑 | | AI 无法正确移动 | 导航网格未正确生成 | 重新生成 Nav Mesh | | 无法判断 AI 是否接近 | 缺乏调试信息 | 添加调试输出 |


    如有需要,我可以提供完整的 Move To 自定义节点代码示例,帮助你实现更精确的 AI 控制逻辑。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月22日