IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 二十八、动作通知与读取资源Json -> 正文阅读

[游戏开发]二十八、动作通知与读取资源Json

交互检测

动画类

public:
	//开启和关闭手上物品的交互检测
	UFUNCTION(BlueprintCallable, Category = "SlAi")
		void ChangeDetection(bool IsOpen);
void USlAiPlayerAnim::ChangeDetection(bool IsOpen)
{
	if (!SPCharacter) return;
	SPCharacter->ChangeHandObjectDetect(IsOpen);
}

角色类

public:
	//修改手持物品的碰撞检测是否开启
	void ChangeHandObjectDetect(bool IsOpen);
void ASlAiPlayerCharacter::ChangeHandObjectDetect(bool IsOpen)
{
	//获取手上物品
	ASlAiHandObject* HandObjectClass = Cast<ASlAiHandObject>(HandObject->GetChildActor());
	if (HandObjectClass) HandObjectClass->ChangeOverlayDetect(IsOpen);
}

物品类

public:	
	//是否允许检测
	void ChangeOverlayDetect(bool IsOpen);
void ASlAiHandObject::ChangeOverlayDetect(bool IsOpen)
{
	//初始时关闭Overlay检测
	AffectCollision->bGenerateOverlapEvents = IsOpen;
}

在动画蓝图设置通知

在这里插入图片描述

运行

在这里插入图片描述

读取资源Json

先定义资源类型和属性结构体

//资源类型
namespace EResourceType {
	enum Type
	{
		Plant=0,
		Metal,
		Animal
	};
}

//资源属性结构体
struct ResourceAttribute
{
	FText EN;//英文名
	FText ZH;//中文名
	EResourceType::Type ResourceType;
	int HP;
	//掉落物
	TArray<TArray<int>> FlobObjectInfo;


	ResourceAttribute(const FText ENName, const FText ZHName, const EResourceType::Type RT, const int HPValue, TArray<TArray<int>>* FOI)
	{
		EN = ENName;
		ZH = ZHName;
		ResourceType = RT;
		HP = HPValue;
		
		//将数组元素迭代进本地数组
		for (TArray<TArray<int>>::TIterator It(*FOI); It; ++It)
		{
			TArray<int> FlobObjectInfoItem;
			for (TArray<int>::TIterator Ih(*It); Ih; Ih++)
			{
				FlobObjectInfoItem.Add(*Ih);
			}
			FlobObjectInfo.Add(FlobObjectInfoItem);
		}
	}

	//临时
	FString ToString()
	{
		FString InfoStr;
		for (TArray<TArray<int>>::TIterator It(FlobObjectInfo); It; ++It)
		{
			for (TArray<int>::TIterator Ih(*It); Ih; ++Ih)
			{
				InfoStr += FString::FromInt(*Ih) + FString(".");
			}
			InfoStr += FString("__");
		}
		return EN.ToString() + FString("--") + ZH.ToString() + FString("--") + FString::FromInt((int)ResourceType) + FString("--") + FString::FromInt(HP) + FString("--") + InfoStr;
	}

};

解析资源文件

public:
...
	//解析资源属性函数
	void ResourceAttrJsonRead(TMap<int, TSharedPtr<ResourceAttribute>>& ResourceAttrMap);

private:
...
	//定义一个从String转换到ResourceType的方法
	EResourceType::Type StringToResourceType(const FString ArgStr);

private:

	//存档文件名
	FString RecordDataFileName;

	//物品属性文件名
	FString ObjectAttrFileName;

	//资源属性文件名
	FString ResourceAttrFileName;

	//相对路径
	FString RelativePath;
};
SlAiJsonHandle::SlAiJsonHandle()
{
	RecordDataFileName = FString("RecordData.json");
	ObjectAttrFileName = FString("ObjectAttribute.json");
	ResourceAttrFileName = FString("ResourceAttribute.json");

	RelativePath = FString("Res/ConfigData/");
}

void SlAiJsonHandle::ResourceAttrJsonRead(TMap<int, TSharedPtr<ResourceAttribute>>& ResourceAttrMap)
{
	FString JsonValue;
	LoadStringFromFile(ResourceAttrFileName, RelativePath, JsonValue);

	TArray<TSharedPtr<FJsonValue>> JsonParsed;
	TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonValue);

	if (FJsonSerializer::Deserialize(JsonReader, JsonParsed))
	{
		for (int i = 0; i < JsonParsed.Num(); ++i)
		{
			//资源没有序号0,从1开始
			TArray<TSharedPtr<FJsonValue>> ResourceAttr = JsonParsed[i]->AsObject()->GetArrayField(FString::FromInt(i + 1));
			FText EN = FText::FromString(ResourceAttr[0]->AsObject()->GetStringField("EN"));
			FText ZH = FText::FromString(ResourceAttr[1]->AsObject()->GetStringField("ZH"));
			EResourceType::Type ResourceType = StringToResourceType(ResourceAttr[2]->AsObject()->GetStringField("ResourceType"));
			int HP = ResourceAttr[3]->AsObject()->GetIntegerField("HP");

			TArray<TArray<int>> FlobObjectInfoArray;

			TArray<TSharedPtr<FJsonValue>> FlobObjectInfo = ResourceAttr[4]->AsObject()->GetArrayField(FString("FlobObjectInfo"));

			for (int j = 0; j < FlobObjectInfo.Num(); ++j) {

				FString FlobObjectInfoItem = FlobObjectInfo[j]->AsObject()->GetStringField(FString::FromInt(j));
				FString ObjectIndexStr;
				FString RangeStr;
				FString RangeMinStr;
				FString RangeMaxStr;
				FlobObjectInfoItem.Split(FString("_"), &ObjectIndexStr, &RangeStr);
				RangeStr.Split(FString(","), &RangeMinStr, &RangeMaxStr);

				TArray<int> FlobObjectInfoList;

				FlobObjectInfoList.Add(FCString::Atoi(*ObjectIndexStr));
				FlobObjectInfoList.Add(FCString::Atoi(*RangeMinStr));
				FlobObjectInfoList.Add(FCString::Atoi(*RangeMaxStr));

				FlobObjectInfoArray.Add(FlobObjectInfoList);
			}

			TSharedPtr<ResourceAttribute> ResourceAttrPtr = MakeShareable(new ResourceAttribute(EN, ZH, ResourceType, HP, &FlobObjectInfoArray));

			ResourceAttrMap.Add(i + 1, ResourceAttrPtr);
		}
	}
	else
	{
		SlAiHelper::Debug(FString("Deserialize Failed"), 10.f);
	}
}

初始化资源属性Map

public:
	//资源属性图
	TMap<int, TSharedPtr<ResourceAttribute>> ResourceAttrMap;
	
private:
	//初始化资源属性图
	void InitResourceAttrMap();
void SlAiDataHandle::InitResourceAttrMap()
{
	SlAiSingleton<SlAiJsonHandle>::Get()->ResourceAttrJsonRead(ResourceAttrMap);
	for (TMap<int, TSharedPtr<ResourceAttribute>>::TIterator It(ResourceAttrMap); It; ++It)
	{
		SlAiHelper::Debug((It->Value)->ToString(), 120.f);
	}
}

void SlAiDataHandle::InitializeGameData()
{
	//初始化物品属性图
	InitObjectAttr();

	//初始化资源属性图
	InitResourceAttrMap();

	//填充笔刷数组
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->EmptyBrush);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_1);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_2);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_3);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_4);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_5);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_6);
	ObjectBrushList.Add(&SlAiStyle::GetGameStyle()->ObjectBrush_7);
}

运行

在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:37:17  更:2021-11-29 16:37:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 7:51:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码