欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 斯坦福UE4 C++课学习补充23:AI自定义任务

斯坦福UE4 C++课学习补充23:AI自定义任务

2025/8/16 17:07:01 来源:https://blog.csdn.net/weixin_51524146/article/details/141297251  浏览:    关键词:斯坦福UE4 C++课学习补充23:AI自定义任务

文章目录

  • 一、自定义任务节点
  • 二、优化
    • 1. 子弹发射冷却
    • 2. 攻击时面朝玩家

一、自定义任务节点

  1. 本节需要创建自定义任务节点BTTask,实现小兵进入角色范围后进射击的功能。
  2. 对于BTTaskNode的子类,我们需要在代码中重写ExecuteTask函数即可。返回值为EBTNodeResult::FailedEBTNodeResult::Successd,对应行为树的节点返回失败或者成功。
//SBTTask_RangeAttack.h
UCLASS()
class FPSPROJECT_API USBTTask_RangeAttack : public UBTTaskNode
{GENERATED_BODY()
protected:virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override;//用于角色发射投掷物攻击UPROPERTY(EditAnywhere, Category = "AI")TSubclassOf<AActor> ProjectileClass;
};//SBTTask_RangeAttack.cpp
EBTNodeResult::Type USBTTask_RangeAttack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{AAIController* MyController = OwnerComp.GetAIOwner();if(ensure(MyController)){ACharacter* MyPawn = Cast<ACharacter>(MyController->GetPawn());if(MyPawn == nullptr){return EBTNodeResult::Failed;}AActor* TargetActor = Cast<AActor>(OwnerComp.GetBlackboardComponent()->GetValueAsObject("TargetActor"));if(TargetActor == nullptr){return EBTNodeResult::Failed;}FVector MuzzleLocation = MyPawn->GetMesh()->GetSocketLocation("Muzzle_01");//方向向量=目标位置-当前位置FVector Direction = TargetActor->GetActorLocation() - MuzzleLocation;FRotator MuzzleRotation = Direction.Rotation();FActorSpawnParameters params;params.Instigator = MyPawn;params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;ensure(ProjectileClass);AActor* NewProj = GetWorld()->SpawnActor<AActor>(ProjectileClass, MuzzleLocation, MuzzleRotation);return NewProj ? EBTNodeResult::Succeeded : EBTNodeResult::Failed;}return EBTNodeResult::Failed;
}

二、优化

1. 子弹发射冷却

Cooldown节点会控制节点执行的间隔,当节点处于冷却时间时,会直接返回false,以下节点自然都不会执行。Loop节点则会循环执行以下节点。

此时AI的逻辑:如果目标在攻击范围外,会向目标移动。进入攻击范围后,开枪向角色以0.5s为间隔时间射击三次,冷却2s。在此期间,行为树会运行后面两个节点,再重新判断是否结束冷却。

2. 攻击时面朝玩家

行为树自带了一个修改AI小兵的朝向服务BTServiceSet defalt focus,从而不需要再使用SetActorRotation函数

  • 最终的完整图(包括之后的EQS):
    在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词