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读取

物品属性数据结构

SlAiTypes

//物品类型
namespace EObjectType
{
	enum Type
	{
		Normal=0,//普通物品,木头,石头
		Food,//食物,苹果,肉
		Tool,//工具,锤子,斧子
		Weapon //武器,剑
	};
}


//物品属性结构
struct ObjectAttribute
{
	FText EN;//英文名
	FText ZH;//中文名

	EObjectType::Type ObjectType;//物品类型
	int PlantAttack;//对植物的攻击力
	int MetalAttack;//对金属资源的攻击力
	int AnimalAttack;//对动物的攻击力
	int AffectRange;//攻击距离
	FString TexPath;//图片路径
	//构造函数
	ObjectAttribute(const FText ENName, const FText ZHName, const EObjectType::Type OT, const int PA, const int MA, const int AA, const int AR, const FString TP)
	{
		EN = ENName;
		ZH = ZHName;
		ObjectType = OT;
		PlantAttack = PA;
		MetalAttack = MA;
		AnimalAttack = AA;
		AffectRange = AR;
		TexPath = TP;
	}


	FString ToString() {
		return EN.ToString() + FString("--") + ZH.ToString() + FString("--") + FString::FromInt((int)ObjectType) + FString("--") +
			FString::FromInt(PlantAttack) + FString("--") + FString::FromInt(MetalAttack) + FString("--") + 
			FString::FromInt(AnimalAttack) + FString("--") + FString::FromInt(AffectRange) + FString("--") + TexPath;
	}
};

解析物品属性和另一种StringToObject方法

SlAiJsonHandle

public:
	//解析物品属性
	void ObjectAttrJsonRead(TMap<int, TSharedPtr<ObjectAttribute>>& ObjectAttrMap);

private:
	//定义一个从String转换到ObjectType的方法
	EObjectType::Type FStringToObjectType(const FString ArgStr);

private:
	//物品属性文件名
	FString ObjectAttrFileName;
#include "SlAiJsonHandle.h"
#include"SlAiHelper.h"

SlAiJsonHandle::SlAiJsonHandle()
{
	RecordDataFileName = FString("RecordData.json");
	ObjectAttrFileName = FString("ObjectAttribute.json");

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




void SlAiJsonHandle::ObjectAttrJsonRead(TMap<int, TSharedPtr<ObjectAttribute>>& ObjectAttrMap)
{
	FString JsonValue;
	LoadStringFromFile(ObjectAttrFileName, 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)
		{
			TArray<TSharedPtr<FJsonValue>> ObjectAttrArray = JsonParsed[i]->AsObject()->GetArrayField(FString::FromInt(i));

			FText EN = FText::FromString(ObjectAttrArray[0]->AsObject()->GetStringField("EN"));
			FText ZH = FText::FromString(ObjectAttrArray[1]->AsObject()->GetStringField("ZH"));
			FString ObjectTypeStr = ObjectAttrArray[2]->AsObject()->GetStringField("ObjectType");
			int PlantAttack = ObjectAttrArray[3]->AsObject()->GetIntegerField("PlantAttack");
			int MetalAttack = ObjectAttrArray[4]->AsObject()->GetIntegerField("MetalAttack");
			int AnimalAttack = ObjectAttrArray[5]->AsObject()->GetIntegerField("AnimalAttack");
			int AffectRange = ObjectAttrArray[6]->AsObject()->GetIntegerField("AffectRange");
			FString TexPath = ObjectAttrArray[7]->AsObject()->GetStringField("TexPath");

			EObjectType::Type ObjectType = FStringToObjectType(ObjectTypeStr);
			TSharedPtr<ObjectAttribute> ObjectAttrPtr = MakeShareable(new ObjectAttribute(EN, ZH, ObjectType, PlantAttack, MetalAttack, AnimalAttack, AffectRange, TexPath));

			ObjectAttrMap.Add(i, ObjectAttrPtr);
		}
	}
}





bool SlAiJsonHandle::LoadStringFromFile(const FString& FileName, const FString& RelaPath, FString& ResultString)
{
	if (!FileName.IsEmpty()) {
		//获取绝对路径FPaths::ProjectDir() + Content/Res/ConfigData/FileName
		FString AbsoPath = FPaths::ProjectContentDir() + RelaPath + FileName;
		if (FPaths::FileExists(AbsoPath))
		{
			if (FFileHelper::LoadFileToString(ResultString, *AbsoPath))
			{
				return true;
			}
			else
			{
				//加载不成功
				SlAiHelper::Debug(FString("Load Error") + AbsoPath);
			}
		}
		else
		{
			//输出文件不存在
			SlAiHelper::Debug(FString("File Not Exist") + AbsoPath);
		}
	}
	return false;
}



EObjectType::Type SlAiJsonHandle::FStringToObjectType(const FString ArgStr)
{
	if (ArgStr.Equals(FString("Normal"))) return EObjectType::Normal;
	if (ArgStr.Equals(FString("Food"))) return EObjectType::Food;
	if (ArgStr.Equals(FString("Tool"))) return EObjectType::Tool;
	if (ArgStr.Equals(FString("Weapon"))) return EObjectType::Weapon;
	return EObjectType::Normal;
}



在这里插入图片描述

物品属性初始化

在GameMode的BeginPlay中初始化

SlAiDataHandle

public:
	
	//游戏数据初始化
	void InitializeGameData();

public:
	//物品属性图
	TMap<int, TSharedPtr<ObjectAttribute>>ObjectAttrMap;
	
private:
	//初始化物品属性图
	void InitObjectAttr();

void SlAiDataHandle::InitObjectAttr()
{
//将ObjectAttribute.json里面的内容解析到ObjectAttrMap里
	SlAiSingleton<SlAiJsonHandle>::Get()->ObjectAttrJsonRead(ObjectAttrMap);
}

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

//Debug
	for (TMap<int, TSharedPtr<ObjectAttribute>>::TIterator It(ObjectAttrMap); It; ++It)
	{
		SlAiHelper::Debug(It->Value->ToString(), 120);
	}
}

SlAiGameMode

void ASlAiGameMode::BeginPlay()
{
	//初始化游戏数据
	SlAiDataHandle::Get()->InitializeGameData();
}

运行

在这里插入图片描述

  游戏开发 最新文章
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-27 10:14:05  更:2021-11-27 10:14:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 22:21:28-

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