如何在场景开启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%的容错率

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

  1. 吃鸡11月15服务器维护,绝地求生11月20日维护到几点 11.20吃鸡更新维护公告

    绝地求生在11月20日这天官方宣布开启停机的更新维护,此次的更新时间为8个小时,可以说非常长了,重点是第五赛季第二轮的更新内容,下面就来为大家分享一下绝地求生的更新维护公告. [正式服维护公告] 我们 ...

  2. 华为云开发者日震撼来袭!11月20日,上海见

    首场华为云开发者日HDC.Cloud Day开始报名啦!相约上海,感受科技的无限魅力! 华为云开发者日HDC.Cloud Day是面向全球开发者的旗舰活动,打造开发者专属的技术盛宴.汇聚来自千行百业. ...

  3. 楚留香服务器维护时间,《楚留香:一梦江湖》11月20日维护更新公告

    诸位亲爱的少侠: 秋风吹尽旧庭柯,黄叶丹枫客里过.天气肃清,金陵城的庙会让初冬添了不少暖意. 本次维护我们对部分系统体验进行优化.维护结束后将对全服玩家发放例行维护福利,请少侠前往邮箱领取. 一点禅灯 ...

  4. 高能手办团个别服务器维护,《高能手办团》11月20日例行维护公告

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 各位亲爱的手办收藏家: 为了提升您在手办世界中的游戏体验,<高能手办团>将于11月20日5:50进行例行维护.维护期间,收藏家们将无法进入原服 ...

  5. 开发者的云计算盛会,期待您的参与(11月20日~21日,北京,免费)

    立即报名 报名截止时间:11月16日23:00 天气正逐渐变冷,而云计算的热潮正席卷全球.作为开发者,您或许可以不关注Windows 8,您或许可以不关注智能手机,但您不能不关注云计算,因为您开发的程 ...

  6. 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)

    分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日) 本周Silverlight学习资源更新 Silverlight App.xaml用途 Jaso ...

  7. VDI SolutionTrack - 上海站:11月20日

    如果您无法正常显示此邮件,请点击这里 [url]http://www.chnteamax.com/11.3/shanghai/edm.html[/url] SolutionTrack - Virtua ...

  8. csgo中国上海服务器因维护,2019CSGO亚洲邀请赛11月20日战火重燃 再临上海

    由完美世界主办的2019CSGO亚洲邀请赛将于11月20日再度在上海重燃战火!本次CSGO亚洲邀请赛共有八支参赛战队,他们是EG.AVANGAR.Mouz.G2.ENCE.Mibr.Tyloo和VG, ...

  9. 【历史上的今天】11 月 20 日:微软发布 Windows 1.0;Lotus Notes 发明者出生;奔腾4 诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 11 月 20 日,在 27 年前的今天,世界上首例人造心脏移植手术成功:一名退休的电影制片人成为世 ...

最新文章

  1. PHP 毫秒级定时器,实现php毫秒定时器方法详解
  2. 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
  3. python小程序-Python基本小程序
  4. 虚拟服务器设置upnp,TP-Link路由器如何设置UPNP开启【设置步骤】
  5. android 开发中的常见问题
  6. C++中的指针与引用(转)
  7. 爬虫学习一:HTTP、网页基础、requests、API、JS
  8. Linux内存管理:转换后备缓冲区(TLB)原理
  9. oracle安装前准备,Oracle 安装前准备
  10. python pep8_Python 代码风格 和 PEP8
  11. MIT6.830 lab2 SimpleDB Operators 实验报告
  12. Unity3D 怎样在安卓手机上播放视频
  13. delphi 读取pdf
  14. JavaScript学习笔记
  15. 什么是GMSK调制-高斯最小移位键控
  16. vue项目中使用百度离线地图(最新全面爬坑版)
  17. arm920t内核技术手册
  18. ORA-20001: Latest xml inventory is not loaded into table
  19. Ubuntu 安装 QEMU
  20. 前端项目性能优化方案有哪些

热门文章

  1. mongodb 分组获取最新一条的数据
  2. 【架构风格】架构风格演进和领域架构分类
  3. Cisco 3650交换机断电后配置无法保存
  4. C++ opengl 漫反射和镜面反射参数
  5. 教你如何合并pdf文件
  6. android第三方菜单设计,Android菜单设计指南(上)
  7. TurboLaunch启动后无法显示的问题
  8. 高中数学40分怎么办_高二了数学40多分还有救吗?
  9. 【京东电商网站主界面仿写—
  10. tplink怎么进去_如何进入tp-link路由器设置页面