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%的容错率
11月20日 如何在场景开启Debug,自定义AI任务,EQS,创建自己的环境任务,使用Pawn环境检测来检测周围的环境,让AI动作更顺滑(动画混合相关推荐
- 吃鸡11月15服务器维护,绝地求生11月20日维护到几点 11.20吃鸡更新维护公告
绝地求生在11月20日这天官方宣布开启停机的更新维护,此次的更新时间为8个小时,可以说非常长了,重点是第五赛季第二轮的更新内容,下面就来为大家分享一下绝地求生的更新维护公告. [正式服维护公告] 我们 ...
- 华为云开发者日震撼来袭!11月20日,上海见
首场华为云开发者日HDC.Cloud Day开始报名啦!相约上海,感受科技的无限魅力! 华为云开发者日HDC.Cloud Day是面向全球开发者的旗舰活动,打造开发者专属的技术盛宴.汇聚来自千行百业. ...
- 楚留香服务器维护时间,《楚留香:一梦江湖》11月20日维护更新公告
诸位亲爱的少侠: 秋风吹尽旧庭柯,黄叶丹枫客里过.天气肃清,金陵城的庙会让初冬添了不少暖意. 本次维护我们对部分系统体验进行优化.维护结束后将对全服玩家发放例行维护福利,请少侠前往邮箱领取. 一点禅灯 ...
- 高能手办团个别服务器维护,《高能手办团》11月20日例行维护公告
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 各位亲爱的手办收藏家: 为了提升您在手办世界中的游戏体验,<高能手办团>将于11月20日5:50进行例行维护.维护期间,收藏家们将无法进入原服 ...
- 开发者的云计算盛会,期待您的参与(11月20日~21日,北京,免费)
立即报名 报名截止时间:11月16日23:00 天气正逐渐变冷,而云计算的热潮正席卷全球.作为开发者,您或许可以不关注Windows 8,您或许可以不关注智能手机,但您不能不关注云计算,因为您开发的程 ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)
分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日) 本周Silverlight学习资源更新 Silverlight App.xaml用途 Jaso ...
- VDI SolutionTrack - 上海站:11月20日
如果您无法正常显示此邮件,请点击这里 [url]http://www.chnteamax.com/11.3/shanghai/edm.html[/url] SolutionTrack - Virtua ...
- csgo中国上海服务器因维护,2019CSGO亚洲邀请赛11月20日战火重燃 再临上海
由完美世界主办的2019CSGO亚洲邀请赛将于11月20日再度在上海重燃战火!本次CSGO亚洲邀请赛共有八支参赛战队,他们是EG.AVANGAR.Mouz.G2.ENCE.Mibr.Tyloo和VG, ...
- 【历史上的今天】11 月 20 日:微软发布 Windows 1.0;Lotus Notes 发明者出生;奔腾4 诞生
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 11 月 20 日,在 27 年前的今天,世界上首例人造心脏移植手术成功:一名退休的电影制片人成为世 ...
最新文章
- PHP 毫秒级定时器,实现php毫秒定时器方法详解
- 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
- python小程序-Python基本小程序
- 虚拟服务器设置upnp,TP-Link路由器如何设置UPNP开启【设置步骤】
- android 开发中的常见问题
- C++中的指针与引用(转)
- 爬虫学习一:HTTP、网页基础、requests、API、JS
- Linux内存管理:转换后备缓冲区(TLB)原理
- oracle安装前准备,Oracle 安装前准备
- python pep8_Python 代码风格 和 PEP8
- MIT6.830 lab2 SimpleDB Operators 实验报告
- Unity3D 怎样在安卓手机上播放视频
- delphi 读取pdf
- JavaScript学习笔记
- 什么是GMSK调制-高斯最小移位键控
- vue项目中使用百度离线地图(最新全面爬坑版)
- arm920t内核技术手册
- ORA-20001: Latest xml inventory is not loaded into table
- Ubuntu 安装 QEMU
- 前端项目性能优化方案有哪些