11月22日 EQS优化,让AI知道什么地方不能走,自定义游戏模式,让AI在玩家旁边生成,难度提升,随着时间增多的AI

2023-11-07

EQS优化,让AI知道什么地方不能走

首先进行小修改,创建一个新的AIEQS

新建一个测试pawn

把测试pawn放入场景内,在eqs中放入我们写的eqs任务,使用模拟游戏,就可以直接可视化eqs的选择坐标点

https://docs.unrealengine.com/5.0/en-US/environment-query-testing-pawn-in-unreal-engine/

这样调整eqs的时候可以更直观

添加距离检测,防止ai过于靠近pawn

修改为最小距离,最小距离为1000,并且调整Point Per Ring

如何防止AI导航到方块内

使用NavModifierVolume

在EQS内修改AI范围

也可以使用查询路径来判断AI在哪些方面不能进行行走,但是非常吃资源

自定义游戏模式

创建GameClass类

这里我也不放截图,直接复制代码

gamebase .h

// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AI/SAICharacter.h" #include "EnvironmentQuery/EnvQueryTypes.h" #include "GameFramework/GameModeBase.h" #include "SGameModeBase.generated.h" class UEnvQueryInstanceBlueprintWrapper; class UEnvQuery; /** * */ UCLASS() class ACTIONROUGELIKE_API ASGameModeBase : public AGameModeBase { GENERATED_BODY() protected: UPROPERTY(EditAnywhere,Category="AI") TSubclassOf<AActor> MinionClass; UPROPERTY(EditAnywhere,Category="AI") UCurveFloat* DifficultyCurve; UPROPERTY(EditAnywhere,Category="AI") UEnvQuery* SpawnBotQuery ; FTimerHandle TimerHandle_SpawnBots; //EEnvQueryStatus::Type枚举类型 UFUNCTION() void OnQueryCompleted( UEnvQueryInstanceBlueprintWrapper* QueryInstance, EEnvQueryStatus::Type QueryStatus); UPROPERTY(EditAnywhere,Category="AI") float SpawnTimerInterval; UFUNCTION() void SpawnTimerElapsed(); public: ASGameModeBase(); virtual void StartPlay() override;; };

.cpp

// Fill out your copyright notice in the Description page of Project Settings. #include "SGameModeBase.h" #include "EnvironmentQuery/EnvQueryManager.h" #include "EnvironmentQuery/EnvQueryTypes.h" #include "EnvironmentQuery/EnvQueryInstanceBlueprintWrapper.h" #include "AI/SAICharacter.h" #include "SAttributeComponent.h" #include "EngineUtils.h" ASGameModeBase::ASGameModeBase() { SpawnTimerInterval =2.0f; } void ASGameModeBase::StartPlay() { //继承Base的StartPlay Super::StartPlay(); /*我们正在从我们的时间管理器对象创建一个计时器。 然后我们注册这个回调以使用我们的定时器句柄。 然后我们分配一个回调方法,在倒计时结束时触发。 最后我们设置倒计时时间为SpawnTimerInterval秒。*/ GetWorldTimerManager().SetTimer(TimerHandle_SpawnBots,this,&ASGameModeBase::SpawnTimerElapsed,SpawnTimerInterval,true); } void ASGameModeBase::SpawnTimerElapsed() { //执行EQS查询,在全局搜索内查询RunEQSQuery可以找到EnvQueryManage.cpp这个文件,在这个文件内可以找到这个函数 UEnvQueryInstanceBlueprintWrapper* QueryInstance = UEnvQueryManager::RunEQSQuery(this,SpawnBotQuery,this,EEnvQueryRunMode::RandomBest5Pct,nullptr); if(ensure(QueryInstance)) { //查询出一个节点后在5%这个误差内执行OnQueryCompleted这个函数 QueryInstance->GetOnQueryFinishedEvent().AddDynamic(this,&ASGameModeBase::OnQueryCompleted); } } //在玩家周围生成Bot void ASGameModeBase::OnQueryCompleted(UEnvQueryInstanceBlueprintWrapper* QueryInstance,EEnvQueryStatus::Type QueryStatus) { //确认是否生成 if(QueryStatus != EEnvQueryStatus::Success) { UE_LOG(LogTemp,Warning,TEXT("无法生成EQS:SpawnBotQuery!")) return; } //默认机器人为0 int32 NrOfAliveBots = 0; //判断机器人是否需要添加 for (TActorIterator<ASAICharacter> It(GetWorld()); It; ++It) { ASAICharacter* Bot = *It; USAttributeComponent* AttributeComp = Cast<USAttributeComponent>(Bot->GetComponentByClass(USAttributeComponent::StaticClass())); if (ensure(AttributeComp) && AttributeComp->IsALive()) { NrOfAliveBots++; } } //当判断距离,UCurveFloat* DifficultyCurve可以理解成根据曲线数值判断 if(DifficultyCurve) { DifficultyCurve->GetFloatValue(GetWorld()->TimeSeconds); } //最大bot数量为10 float MaxBotCount =10.0f; //当数量过多的时候就return if(NrOfAliveBots>MaxBotCount) { return; } //获得EQS生成点的Locations,并添加到数组内 TArray<FVector> Locations = QueryInstance->GetResultsAsLocations(); //判断数组内是否有第一个值 if(Locations.IsValidIndex(0)) { //生成Bot GetWorld()->SpawnActor<AActor>(MinionClass,Locations[0],FRotator::ZeroRotator); } }

让AI在世界生成的时候自动添加AI控制器并执行

ASAICharacter::ASAICharacter() { // Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; PawnSensingComp = CreateDefaultSubobject<UPawnSensingComponent>("PawnSensingComp"); //ai生成在世界内后自动执行控制器 AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; }

##报错,无法间接强制转换

 

查找资料后发现要手动引用

#include "EngineUtils.h"

这样就可以正确编译了

难度提升,随着时间增多的AI

创建一条曲线

添加曲线

最后把曲线放在Gamemode内

效果图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11月22日 EQS优化,让AI知道什么地方不能走,自定义游戏模式,让AI在玩家旁边生成,难度提升,随着时间增多的AI 的相关文章

随机推荐

  • C++中的虚函数和纯虚函数详细讲解

    1 虚函数 1 1 概念 1 定义一个函数为虚函数 不代表函数为不被实现的函数 2 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数 1 2 简介 假设我们有下面的类层次 class A public virtual void fo
  • 用ping让对方电脑堵塞瘫痪

    用ping让对方电脑堵塞瘫痪2008 04 27 11 32 定义echo数据包大小 在默认的情况下windows的ping发送的数据包大小为32byt 我们也可以自己定义它的大小 但有一个大小的限制 就是最大只能发送65500byt 也许
  • Codeforces Round #736 (Div. 2)_A. Gregor and Cryptography

    A Gregor and Cryptography 题目传送门 题目传送门 题面截图 题目大意 给你个质数P 输出 a b a b a b满足 2
  • Talib技术因子详解(四)

    talib安装方式 pip install Ta lib Tushare数据获取请参考 金融量化分析基础环境搭建 数据获取代码请参考 Talib技术因子详解 一 26 MACD 异同移动平均线 调用方式如下 macd macdsignal
  • Swingbench基准测试-4、基准测试报告(results2pdf)

    生成基准测试报告 基准测试完成后 自动将生成测试结果 results xml 该文件需要可使用 results2pdf 将xml结果生成pdf格式 转换过程如下 results2pdf bat c results xml o results
  • C# 迭代器实现枚举器

    在上一篇日志中说的手动实现枚举器来枚举自定义的类型 http blog csdn net weixingstudio article details 6817319 可以看到过程非常复杂 而且容易出错 为了减轻程序员的负担 C 还提供了迭代
  • tp5开发购物商城

    Tp5 1开发购物商城 本人已自学2年 PHP计算数据库中商品总和 非联表查询 1 首先利用client type 注册类型 client id 注册ID 查询出对应的产品订单 2 在common公共文件中 利用对产品表进行查询出相应的价格
  • Qt d指针简单实现及解析

    object h ifndef OBJECT H define OBJECT H define INVOKE METHOD PRIVATE Class Class Private d func return reinterpret cast
  • 虚拟机无法打开“D:\虚拟机\CentOS.vmx”

    虚拟机无法打开 D 虚拟机 CentOS vmx 对于这个问题 解决方法是移管理员身份运行这个VM软件 但是每次都用管理员权限很麻烦 一劳永逸的方法是 1 右击软件打开属性 2 选兼容性那个 3 勾选里面的以管理员身份运行 4 点击确定就可
  • UE4和C++ 开发-Unity 过度到 Unreal 4 对比简化版

    3 两个引擎的部分术语对比 4 7 From GameObjects to Actors 从GameObjects到Actors GameObject在UE4中如何体现 UE4有一个 Gameplay Framework 系统来使用这些Ac
  • 分解质因数模板

    include
  • CTP量化之路一(CTP接口篇)

    随时股票交易越来越顺 条件单系统大大缩减了我看盘的时间 资产越来越多的同时 分散风险也成了个人的需求 因为手时已有成熟的交易策略 自已曾经用的期货账号也还没有被冻结 于是想着拣来做期货自动化 于是自上周向期货公司申请了期货自动化 填写了一堆
  • kubeadm搭建高可用k8s集群

    1 环境准备 hostname IP 组件 m1 192 168 150 140 keepalived haproxy etcd apiserver docker controller manager scheduler m2 192 16
  • 韦东山视频

    第一期 第二期 一期 免费 54节视频 共16 93G 二期 73节视频 每节50分钟总时长3650分钟 共29 6G 掌握写汇编代码的能力 可以分析任意裸板包括U boot 内核里的相关汇编代码 掌握常用的硬件部件的操作 比如GPIO U
  • 【C语言】17-函数-3

    1 链接属性 当组成一个程序的各个源文件分别被编译之后 所有的目标文件以及那些从一个或多个函数库中引用的函数将链接在一起 形成可执行程序 然而 如果相同的标识符出现在几个不同的源文件中时 它们是表示同一个实体 还是表示不同的实体 标识符的链
  • vc不认识 CTreeView

    在VC中调用 CTreeView 方法是 VC会提示error c2504 CTreeView base class undefined CTreeView的基类没有被定义 必须在系统头文件声明处 StdAfx h 加入其头文件 afxcv
  • 把Windows安装到U盘,给Mac电脑用

    启动转换助理是在mac的硬盘分区装win10 mac硬盘金贵呀 以下解决方案把win10安装在u盘 不安装在mac硬盘上 想用的时候插上mac电脑即可 1 把win安装在u盘上 首先在启动转换助理上下载windowssupport文件 具体
  • iOS开发实战之app获取通讯录(iOS 9)

    在做通讯类APP的时候 时常会访问到手机的通讯录 来获取联系人的各种属性 那么本文就来讨论一下怎么获取通讯录 注意 iOS 9 版本上可以行 其他版本未试 第一步 先导入系统库 Contacts framework 然后在 h上导入头文件
  • VGG与风格迁移算法原理

    一 实验介绍 1 1 实验内容 上节课我们学习了卷积神经网络的基本原理 本节实验我们将学习用于图像风格迁移的经典的卷积神经网络模型VGG 并用caffe提供的 draw net py 实现模型的可视化 本节实验我们也将学习图像风格转换的算法
  • 11月22日 EQS优化,让AI知道什么地方不能走,自定义游戏模式,让AI在玩家旁边生成,难度提升,随着时间增多的AI

    EQS优化 让AI知道什么地方不能走 首先进行小修改 创建一个新的AIEQS 新建一个测试pawn 把测试pawn放入场景内 在eqs中放入我们写的eqs任务 使用模拟游戏 就可以直接可视化eqs的选择坐标点 https docs unre