当前位置: 首页 > news >正文

UE的AI判断队伍归属的机制:IGenericTeamAgentInterface接口

从官方论坛老哥那学来的,优点在于使用项目设置,像配置碰撞一样,能配置碰撞通道对其他碰撞通道的反应,如阻挡,忽略,重叠,全局配置队伍归属,也能配置当前队伍对其他队伍的身份识别,如队友,中立,敌人。最终效果看最后的测试How do I use the AI Perception Teams? - #2 by Gossy - C++ - Epic Developer Community Forums

一、定义队伍枚举:

Team.h

#pragma once
#include "GenericTeamAgentInterface.h"
#include "Team.generated.h"

UENUM(BlueprintType)
enum class EGameTeam: uint8
{
	Neutral,
	Team1,
	Team2,
	Team3,
	Team4
};

USTRUCT(BlueprintType)
struct FTeamAttitude
{
	GENERATED_BODY()
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="")
	TArray<TEnumAsByte<ETeamAttitude::Type>> Attitude;

	FTeamAttitude() {};

	FTeamAttitude(std::initializer_list<TEnumAsByte<ETeamAttitude::Type>> attitudes):
		Attitude(std::move(attitudes))
	{ };
};

FTeamAttitude意在包裹一维数组,因为引擎不支持二维数组。所偶一用TArray<FTeamAttitude>来组成二维数组。
二、自定义项目设置
自定义项目设置使用UDeveloperSettings类。需要使用DeveloperSettings模块

MyGameSettings.h

MyGameSettings.cpp

#include "MyGameSettings.h"
ETeamAttitude::Type UMyGameSettings::GetAttitude(FGenericTeamId SourceTeam, FGenericTeamId TargetTeam)
{
	auto & TeamAttitudes = GetDefault<UMyGameSettings>()->TeamAttitudes;
	bool SourceValid = TeamAttitudes.IsValidIndex(SourceTeam.GetId());
	bool TowardValid = TeamAttitudes.IsValidIndex(TargetTeam.GetId());

	if (SourceValid && TowardValid)
	{
		auto & Attitudes = TeamAttitudes[SourceTeam.GetId()].Attitude;
		if (Attitudes.IsValidIndex(TargetTeam.GetId()))
		{
			return Attitudes[TargetTeam.GetId()];
		}
	}
	return ETeamAttitude::Neutral;
}

GetCatrgoryName表示大标题名,GetSectionName表示小标题,UPROPERTY(Category = "")表示标签。UClass(MyCustomSettings,DefaultConfig)表示存储在Config/DefualtMyCustomSettings中(第一次修改后才会出现这个文件)


GetAttitude提供解析这个二维数组方法。通过传入源队伍和目标队伍,得知源队伍对目标队伍的态度。
这个方法要配合FGenericTeamId::SetAttitudeSolver使用



在GameMode.PlayStart中将GetAttitude方法传入即可。

// Fill out your copyright notice in the Description page of Project Settings.


#include "LCGameMode.h"

#include "GenericTeamAgentInterface.h"
#include "MyGameSettings.h"

void ALCGameMode::StartPlay()
{
	Super::StartPlay();
	FGenericTeamId::SetAttitudeSolver(&UMyGameSettings::GetAttitude);
}

追踪一下这个方法在哪里被使用到

void FGenericTeamId::SetAttitudeSolver(const FGenericTeamId::FAttitudeSolverFunction& Solver)
{
	AttitudeSolverImpl = Solver;
}

FGenericTeamId

在这个函数中,会调用解析方法判断态度,如果没设置解析方法,则返回中立。
IGenericTeamAgentInterface:


在IGenericTeamAgentInterface中,获取对其他Actor态度时就是调用这个方法。


而AIController就是实现了这个接口来获取对其他Actor的态度。

总结:AIController最终调用了在GameMode中设置的解析方法来解析项目设置中的二维数组来判断归属,并决定检测还是不检测。
 

三、设置Actor的归属。
1.实现IGenericTeamAgentInterface中的SetGenreicTeamId与GetGenericTeamId接口。

对于玩家,声明Team变量

将TeamId的Setter,Getter转换一下成自己的枚举。
2.对于AIController做相同的操作。因为AIController判断归属时,是将传进来的Actor转换成IGenericTeamAgentInterface,然后将自己和Actor的TeamId传入判断态度。
3.对于AIController控制的NPC,也实现这个接口,用于让AIController判断NPC的身份。

Getter和Setter都调用AIController的Getter和Setter.

至此,玩家和敌人的团队也都设置好了。

四、AI感知

AIController内置了一个AI感知组件的变量,并且在PostRegisterComponent中查找自身有没有这个组件,然后赋值给这个变量,所以起始不内置这个组件


所以需要自己在构造函数中构造这个组件。我顺便添加以下视觉感知,并设置仅感知敌人。

至此大功告成。来测试测试。写了3100字,终于配置好了AI感知和归属检测(汗)
五、测试

设置三个队伍,Team1,Team2,Team3。如下


Team1对Team1友好,对其他中立。

Team2对Team1中立,对Team2友好,对其他敌对。

Team3对Team1中立,对Team3友好,对其他敌对。

测试场景:

1.设置仅检测敌对:

2.设置检测敌对和中立

3.设置全部检测


4.当场更改一下项目设置,Team3对Team1也敌对,看看对Team1会不会由中立变为敌对。


1.仅检测中立:

2.仅检测敌人:

设置生效了,Team1不再被Team3视为中立,而是视为敌人!

总结:这次的论坛老哥很给力。让我学习到了DeveloperSettings类的使用,还有对AI队伍归属机制的进一步理解,并成功实现使用项目设置配置队伍归属权,拓展性更好。进一步的研究可能是怎么将项目设置配置成像碰撞配置那样简洁明了,并且可以在Actor中覆盖。

相关文章:

  • 基础数学:线性代数与优化理论
  • 机器学习 从入门到精通 day_04
  • 分治-归并系列一>翻转对
  • 移动端六大语言速记:第14部分 - 数据库操作
  • 产品开发过程模型
  • 宝塔面板面试内容整理-服务重启
  • 对接日本金融市场数据全指南:K线、实时行情与IPO新股
  • myeclise导入项目并运行
  • vs中版本号如何自动生成,解放双手?
  • 低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡
  • 蓝桥杯第十五届真题——握手问题
  • 案例分析:东华新径,拉动式生产的智造之路
  • 卫星互联网技术加速发展,遨游卫星电话为生命添一份“保险”
  • 按规则批量修改文件夹名称,支持替换或删除文件夹名称中的内容
  • Java网络编程干货
  • 大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究
  • 服务器加空间失败 growpart /dev/vda 1
  • day26图像处理OpenCV
  • FFT简述及其代码多语言实现
  • Django的定制以及admin
  • 在线做交互网站/郑州官网网络营销外包
  • 有哪些专业做饰品的网站app/做外贸推广
  • dedecms做企业网站/免费合作推广
  • 哪个网站有做电箱电柜的图纸/广州seo招聘信息
  • 陕西宝鸡网站建设/域名注册网
  • 韩韩良品只做性价比网站下载/职业培训学校加盟合作