昨天和同学吃饭去了,没来得及做完ai

修复金币贴图

金币没材质是因为贴图错误,在材质内将材质重新添加即可

虚幻争霸小兵缺少动画蓝图

GitHub - tomlooman/ActionRoguelike: Third-person Action Roguelike made in Unreal Engine C++. Project for Unreal Engine Pro C++ Course & Stanford University (CS193U)

在作者的github链接内单独下载MinionRanged_AnimBP.uasset这个文件即可

制作AI

创建AI

添加charaer的类命名为SAICharaer

添加AI控制器类SAIController

在Controller内添加

protected: UPROPERTY(EditDefaultsOnly,Category="AI") UBehaviorTree* BehaviorTree; virtual void BeginPlay() override; };

回到UE4,添加NavMeshBoundsVolume并且在Show里将Nav打开

新建一个行为树

在BB内添加

在BT内添加

然后创建我们自己的控制器

在控制器内添加我们的黑板树

在创建的小兵人物内添加Ai

让Ai移动到我们的位置旁边

在黑版这里添加变量TargetActor,类型为Actor

##Pawn发生了报错,隐藏了类声明

已经解决,错误是发生了命名冲突

重新编译并修改行为树

让AI判断范围内是否有敌人

创建BT

新增TickNode变量

##以下是一些知识点

如何找到需要的函数:

鼠标放在父类Public函数上,按Ctrl+鼠标左键即可进入父类内

在这里找到我们需要的

virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override;

##报错:无法解析的外部符号

无法解析的外部符号 "public: virtual void __cdecl IGameplayTaskOwnerInterface::OnGameplayTaskActivated(class UGameplayTask &)" (?OnGameplayTaskActivated@IGameplayTaskOwnerInterface@@UEAAXAEAVUGameplayTask@@@Z)

这里可以看见是无法解析最外面的IGameplayTaskOwnerInterface这个函数

将头部I去掉,将GameplayTaskOwnerInterface放在Rider的全局搜索(Ctrl+Shift+F)内搜索

在Project里选择UE5,拉到最下面找到UE5.vcxproj.filters这个路径

<ClInclude Include="..\..\..\..\Epic Games\UE_5.0\Engine\Source\Runtime\GameplayTasks\Classes\GameplayTaskOwnerInterface.h">

模组为GameplayTasks

在"项目名称".Build.cs的

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

这里添加GameplayTasks

(可选)在这里添加"AIModule",因为我们的项目内用到了AI模组

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" ,"AIModule", "GameplayTasks" });

修改BT函数

.h文件

protected: //创建一个选择键 UPROPERTY(EditAnywhere,Category="AI") FBlackboardKeySelector AttackRangeKey; virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override;

.cpp文件

void USBTService_CheckAtteckRange::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) { Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds); //检查AI角色到玩家操控角色的距离 //这一步是确认这个角色是否拥有BlackboardComp UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); if(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返回给黑板 BlackboardComp->SetValueAsBool(AttackRangeKey.SelectedKeyName, bWithinRange); } } } } }

重新编译

在黑板内添加一个bool

在行为树的序列这里添加我们自定义的服务

在右边选择刚刚在黑板创建的AttackRange

Interbal的意思是固定时间是0.5秒,Random的是在固定时间+0.1或者-0.1的范围内随机取值范围

在moveto右键添加一个黑板

在黑板的属性里选择黑板创建的布尔

Key Query的set意思是设置为ture,not set的意思是false

##中间效果图忘记截图了

然后简单的修改一下

修改Observer aborts的意思是当布尔值发生改变的时候立即重新执行行为树

这一段的逻辑是:

判断玩家和ai的距离是否是2000米内,如果是,那么AttackRange变化为Ture,Within attack range?这一段判断为否,ai逻辑树到wait.如果Within attack range?这一段判断为ture,ai逻辑树到Move To.

当玩家一开始在范围内也就是Within attack range?这个为false的时候,ai执行wait,当玩家离开范围的时候,Within attack range?判断bool值修改了立即执行Move To,直到再次为false执行wait

效果图

远离的时候:

在范围内的时候

添加AI能否看见角色

void USBTService_CheckAtteckRange::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) { Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds); //检查AI角色到玩家操控角色的距离 //这一步是确认这个角色是否拥有BlackboardComp UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent(); if(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); } } } } }

完成

11月18日 虚幻争霸小兵缺少动画蓝图,让AI动起来与射击,无法解析的外部符号相关推荐

  1. 项目日报模板_新建区重点易涝区能力建设项目2020年11月18日日报

    新建区重点易涝区排涝能力建设项目2020年11月18日日报: 天气  18℃~31℃  晴 赣西联圩: 设备:挖机7台 人员:管理人员:13人,技术工13人,普工19人,钢筋工46人,木工41人 廿四 ...

  2. Windows8/Silverlight/WPF/WP7周学习导读(11月12日-11月18日)

    Windows8/Silverlight/WPF/WP7/HTML5周学习导读(11月12日-11月18日) 本周Windows 8开发学习资源更新 快速构建Windows 8风格应用25-数据绑定 ...

  3. 2013年最后2个月的学习目标(成果)(上次更新2013年11月18日)

    1.2013年11月7日. a.新人毕业-老人跳槽 专栏. 简化标题,调整字体,增加和修改"相关阅读". 增加和修改Tag. b.新人毕业-老人跳槽 专栏. 删除3篇非原创文章. ...

  4. 珠穆朗玛币王:11月18日学会分辨 拒绝盲从

    珠穆朗玛币王:11月18日学会分辨 拒绝盲从 珠穆朗玛币王:11月18日学会分辨,拒绝盲从 最近群里新进了不少刚入圈的朋友,跟大家一番交流后发现,普遍存在一些很基础的问题. 首先是平台.现在大家都把非 ...

  5. 2012华东架构师大会将于2012年11月18日在上海举办

    会议名称:华东架构师大会 时间:2012年11月18日08:30 - 18:00 (星期天) 地点:上海市杨浦区国定东路200号中国创业者公共实训基地主楼22层 参会形式:免费报名制(注释:须事先报名 ...

  6. 【历史上的今天】11 月 18 日:DNS 发明者出生;按键式问世;比尔·盖茨开始编程

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 11 月 18 日,在 1928 年,华特·迪士尼(Walt Disney)和他终身的助手阿维尔克合 ...

  7. 上市公司11月18日周末公告提示

    上市公司11月18日周末公告提示 http://www.sina.com.cn 2007年11月18日 18:17 新浪财经 2007-11-19  星期一 简称变更:   S*ST华侨(600759 ...

  8. 11月18日绝地求生服务器维护,绝地求生今天维护到什么时候结束? 绝地求生11月18日更新公告最新...

    中国小康网讯绝地求生今天维护到什么时候结束?通常情况下,绝地求生每周三都会例行维护一次,偶尔出现一些特殊情况也会推迟到周四或者周五更新,那么今天维护哪些内容,最快什么时候可以完成呢?还不清楚的玩家可以 ...

  9. 投票服务器维护时间,11月18日服务器例行维护公告(已完成)

    本周剑荡八荒S11正式开赛! 1.群雄逐鹿,我意凌云,谁将问鼎江湖?剑雨飞花,八荒竞秀,让我们拭目以待! 参赛获得碎银.银两.绑定点券等丰厚奖励,玩家观战参与竞猜,更可赢取海量荡剑币,请各位侠士做好准 ...

最新文章

  1. Docker周报:Windows Server将支持Mesos
  2. Vijos P1131 最小公倍数和最大公约数问题【暴力】
  3. Github新建分支以处理原仓库提交时detached HEAD的问题
  4. 计算机基础知识关于进制,计算机基础知识-- 进制和编码
  5. 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
  6. 《大话数据结构》第9章 排序 9.6 希尔排序(下)
  7. TypeScript 里的 module 概念
  8. 使用Schematics启用SAP Spartacus的SSR模式
  9. 一场不能只看结果的较量
  10. 家装强电弱电布线图_家装水电施工标准(图文版),装修小白一眼也能看懂。...
  11. Network Emulation(网格模拟)
  12. android的app语言无法切换,Android应用实现多语言切换
  13. 2008 读第一本书
  14. [存档]获取通讯录信息并写到SD卡上
  15. stm32代码_ME3616 NB-IoT模组对接OneNET教程以及STM32代码
  16. python顺序查找的递归算法_Python实现查找算法
  17. Kubernetes详解(二十三)——Deployment控制器更新策略
  18. 东芝MCU实现位带操作
  19. travis java,关于java:在成功构建之后使travis-ci压缩我的项目并将其推送到github
  20. 「 LaTex 」使用多级标题

热门文章

  1. 2018年Android面经-BAT、头条、网易、爱奇艺、华为等等(下)
  2. 洛谷P1173 网格
  3. 编程直播室第三期:实战Django网站开发
  4. caller和callee的使用方法
  5. 微信智能硬件——微信相框
  6. nginx配置下载文件
  7. oracle正则判断数字开头,oracle 正则表达式判断是否数字
  8. html中插入gif的代码,JavaScript插入动态样式实现代码
  9. pandas对数据进行分组统计
  10. 自学大学计算机专业好,大学计算机专业学自我鉴定(通用5篇)