11月20日 如何在场景开启Debug,自定义AI任务,EQS,创建自己的环境任务,使用Pawn环境检测来检测周围的环境,让AI动作更顺滑(动画混合

如何在场景开启Debug

按F1开启线框模式

按'打开Debug数据栏

按数字键3打开EQSDEBUG

开启距离场debug

自定义AI任务

创建BTTask_RangeAttack

.h

// Fill out your copyright notice in the Description page of Project Settings. //这是创建的AI攻击任务 #pragma once #include "CoreMinimal.h" #include "BehaviorTree/BTTaskNode.h" #include "SBTTask_RangeAttack.generated.h" /** * */ UCLASS() class ACTIONROUGELIKE_API USBTTask_RangeAttack : public UBTTaskNode { GENERATED_BODY() //是否进行攻击并有返回值 virtual EBTNodeResult::Type ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) override; protected: //子弹类型 UPROPERTY(EditAnywhere,Category="AI") TSubclassOf<AActor> ProjectileClass; };

.cpp

// Fill out your copyright notice in the Description page of Project Settings. //这是创建的AI攻击任务 #include "AI/SBTTask_RangeAttack.h" #include "AIController.h" #include "BehaviorTree/BlackboardComponent.h" #include "GameFramework/Character.h" EBTNodeResult::Type USBTTask_RangeAttack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) { AAIController* MyController = OwnerComp.GetAIOwner(); if(MyController) { ACharacter* MyPawn = Cast<ACharacter>(MyController->GetPawn()); if(MyPawn == nullptr) { return EBTNodeResult::Failed; } //获取AI的手部位置 FVector MuzzleLocation = MyPawn->GetMesh()->GetSocketLocation("Muzzle_01"); //通过TargetActor变量获取到角色的Actor AActor* TargetActor = Cast<AActor>(OwnerComp.GetBlackboardComponent()->GetValueAsObject("TargetActor")); if(TargetActor == nullptr) { return EBTNodeResult::Failed; } //计算出游戏角色与AI角色手部的距离 FVector Direction = TargetActor->GetActorLocation() - MuzzleLocation; //使距离的方向为发射子弹的方向 FRotator MuzzleRoation = Direction.Rotation(); //设置碰撞 FActorSpawnParameters SpawnParameters; SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; //传入子弹,子弹Location,子弹Roation,子弹碰撞 AActor* NewProjectlie = GetWorld()->SpawnActor<AActor>(ProjectileClass,MuzzleLocation,MuzzleRoation,SpawnParameters); //检查子弹是否成功生成了,如果成功了就返回Succeed,如果失败了就返回Failed return NewProjectlie ? EBTNodeResult::Succeeded : EBTNodeResult::Failed; } return EBTNodeResult::Failed; }

在行为树中添加

 

 

 

在攻击这里添加子弹类型

 

修改BT的.cpp文件,添加视线检测并重新编译

void USBTService_CheckAtteckRange::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) { Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds); //检查AI角色到玩家操控角色的距离 //这一步是确认这个角色是否拥有BlackboardComp UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); if(ensure(BlackboardComp)) { //通过TargetActor变量获取到角色的Actor AActor* TargetActor = Cast<AActor>(BlackboardComp->GetValueAsObject("TargetActor")); if(TargetActor) { //获取到角色Actor后从OwnerComp获得AI控制器 AAIController* MyController = OwnerComp.GetAIOwner(); if(ensure(MyController)) { //从AI控制器获取到AI的Pawn APawn* AIPawn = MyController->GetPawn(); if(ensure(AIPawn)) { //计算角色的位置和AI的位置 float DistanceTo = FVector::Distance(TargetActor->GetActorLocation() , AIPawn->GetActorLocation()); //当距离小于2000时判断为ture bool bWithinRange = DistanceTo < 2000.0f; //判断是否能看见角色,默认为看不见 bool bHasLOS = false; if(bWithinRange) { bHasLOS = MyController->LineOfSightTo(TargetActor); } //返回给黑板 BlackboardComp->SetValueAsBool(AttackRangeKey.SelectedKeyName, (bWithinRange && bHasLOS)); } } } } }

EQS

https://docs.unrealengine.com/5.0/en-US/environment-query-system-quick-start-in-unreal-engine/

UE5的EQS需要在插件中开启

创建随机移动的环境任务

添加Donut和Distance

将EQS添加到行为树

 

发现AI没有移动,进入EQS修改Filter Type

 

发现AI只会选择最优路线,进入行为树修改为25%的容错率

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值