我们在上一步骤中创建了快捷栏的UI界面,在这一部分我们将从Json文件中读取物品的相关信息(种类以及属性),来填充到游戏数据中进行存储以便快捷栏使用,具体分以下几部分完成。

  1.Types.h:

添加物品类型、物品属性结构体(成员变量及初始化函数)

 1 // 物品类型
2 namespace EObjectType
3 {
4 enum Type
5 {
6 Normal = 0, // 普通物品:木头、石头
7 Food, // 食物:苹果、肉
8 Tool, // 工具:锤子、斧子
9 Weapon // 武器:剑
10 };
11 }
12
13 // 物品属性结构体
14 struct ObjectAttribute
15 {
16 FText EN; // 英文名
17 FText ZH; // 中文名
18 EObjectType::Type ObjectType; // 物品类型
19 int PlantAttack; // 对植物的攻击力
20 int MetalAttack; // 对金属资源的攻击力
21 int AnimalAttack; // 对动物的攻击力
22 int AffectRange; // 攻击距离
23 FString TexPath; // 图片路径
24
25 // 构造函数
26 ObjectAttribute(const FText ENName, const FText ZHName, const EObjectType::Type OT, const int PA, const int MA,
27 const int AA, const int AR, const FString TP) : EN(ENName), ZH(ZHName), ObjectType(OT), PlantAttack(PA),
28 MetalAttack(MA), AnimalAttack(MA), AffectRange(AR), TexPath(TP)
29 {}
30
31 };

  2.JsonHandle.h:

添加物品解析(解析函数、文件名、路径)、从string解析ObjectType

 1 {
2 public:
3
4
5 // 解析物品属性
6 void ObjectAttrJsonRead(TMap<int, TSharedPtr<ObjectAttribute>>& ObjectAttrMap);
7
8 private:
9
10
11 // 定义一个从 FString 转换到 ObjectType 的方法
12 EObjectType::Type StringToObjectType(const FString ArgStr);
13
14 private:
15
16 FString RecordDataFileName;
17
18 // 物品属性文件名
19 FString ObjectAttrFileName;
20
21 FString RelativePath;
22 };

  3.JsonHandle.cpp:

构造函数:绑定Json文件路径、

ObjectAttrJsonRead函数:读取物品信息表的Json文件,将物品列表根据id为key信息为value存于ObjectAttrMap中、

StringToObjectType函数:解析string描述的类型获取到ObjectType描述的类型(当然也可以借助ue的反射系统)

 1 SlAiJsonHandle::SlAiJsonHandle()
2 {
3 RecordDataFileName = FString("RecordData.json");
4 // 添加物品属性的 Json 文件路径
5 ObjectAttrFileName = FString("ObjectAttribute.json");
6
7 RelativePath = FString("Res/ConfigData/");
8 }
9
10 // 读取物品的 Json 信息
11 void SlAiJsonHandle::ObjectAttrJsonRead(TMap<int, TSharedPtr<ObjectAttribute>>& ObjectAttrMap)
12 {
13 FString JsonValue;
14 LoadStringFromFile(ObjectAttrFileName, RelativePath, JsonValue);
15
16 TArray<TSharedPtr<FJsonValue>> JsonParsed;
17 TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonValue);
18
19 if (FJsonSerializer::Deserialize(JsonReader, JsonParsed)) {
20 for (int i = 0; i < JsonParsed.Num(); ++i) {
21 TArray<TSharedPtr<FJsonValue>> ObjectAttr = JsonParsed[i]->AsObject()->GetArrayField(FString::FromInt(i));
22 FText EN = FText::FromString(ObjectAttr[0]->AsObject()->GetStringField("EN"));
23 FText ZH = FText::FromString(ObjectAttr[1]->AsObject()->GetStringField("ZH"));
24 FString ObjectTypeStr = ObjectAttr[2]->AsObject()->GetStringField("ObjectType");
25 int PlantAttack = ObjectAttr[3]->AsObject()->GetIntegerField("PlantAttack");
26 // 老师的变量名打错了,如果像我这样把 MetalAttcck 改成 MetalAttack 的话,Json 文件
27 // 里面的对象名记得改一下
28 int MetalAttack = ObjectAttr[4]->AsObject()->GetIntegerField("MetalAttack");
29 int AnimalAttack = ObjectAttr[5]->AsObject()->GetIntegerField("AnimalAttack");
30 int AffectRange = ObjectAttr[6]->AsObject()->GetIntegerField("AffectRange");
31 FString TexPath = ObjectAttr[7]->AsObject()->GetStringField("TexPath");
32
33 EObjectType::Type ObjectType = StringToObjectType(ObjectTypeStr);
34 TSharedPtr<ObjectAttribute> ObjectAttrPtr = MakeShareable(new ObjectAttribute(EN, ZH, ObjectType, PlantAttack, MetalAttack, AnimalAttack, AffectRange, TexPath));
35
36 ObjectAttrMap.Add(i, ObjectAttrPtr);
37 }
38 }
39 else {
40 SlAiHelper::Debug(FString("Deserialize Failed"));
41 }
42 }
43
44
45 // 这里硬编码是因为数据结构类里面,这个枚举类型没有添加反射宏,没办法用 SlAiDataHandle 里的类似代码
46 // 如果读者想写得通用些的话参考 SlAiDataHandle 的类似代码
47 EObjectType::Type StringToObjectType(const FString ArgStr)
48 {
49 if (ArgStr.Equals(FString("Normal"))) return EObjectType::Normal;
50 if (ArgStr.Equals(FString("Food"))) return EObjectType::Food;
51 if (ArgStr.Equals(FString("Tool"))) return EObjectType::Tool;
52 if (ArgStr.Equals(FString("Weapon"))) return EObjectType::Weapon;
53 return EObjectType::Normal;
54 }

  4.DataHandle.h

添加在游戏中存储物品信息列表的ObjectAttrMap

创建给所有游戏数据初始化的InitializeGameData()函数

创建给ObjectAttrMap初始化的InitObjectAttr()函数

 1 class SLAICOURSE_API SlAiDataHandle
2 {
3 public:
4
5 // 游戏数据初始化
6 void InitializeGameData();
7
8 public:
9 // 物品属性图
10 TMap<int, TSharedPtr<ObjectAttribute>> ObjectAttrMap;
11
12 private:
13
14 // 初始化物品属性图
15 void InitObjectAttr();
16 };

  5.DataHandle.cpp

InitializeGameData()函数:调用初始化ObjectAttrMap的InitObjectAttr()函数

InitObjectAttr()函数:调用JsonHandle提供的ObjectAttrJsonRead函数,从Json文件中读取物品集数据并填充到ObjectAttrMap中完成初始化

 1 void SlAiDataHandle::InitializeGameData()
2 {
3 // 初始化物品属性图
4 InitObjectAttr();
5 }
6
7 void SlAiDataHandle::InitObjectAttr()
8 {
9 SlAiSingleton<SlAiJsonHandle>::Get()->ObjectAttrJsonRead(ObjectAttrMap);
10
11 }

  6.GameMode.cpp

BeginPlay()函数:调用DataHandle的InitializeGameData()函数,在游戏开始前完成对游戏所需数据的初始化

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

UE4纯C++实现游戏快捷栏之物品读取的更多相关文章

  1. WPF编游戏系列 之三 物品清单

    原文:WPF编游戏系列 之三 物品清单        本篇将介绍如何通过C#自动生成游戏界面,主要演示点击"My Shop"后如何显示所有物品清单.其中数据源来自于Access 2 ...

  2. UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合

    前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发.   UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fr ...

  3. Unity3D游戏开发——显示物品的仓库UI

    访问仓库物品列表的方法 为了在UI中显示物品列表,我们需要给InventoryManager添加两个能够访问它的公有方法: 代码: ··· public List<string> GetI ...

  4. 张瀚荣:如何用UE4制作3D动作游戏

    转自:http://www.gamelook.com.cn/2015/06/218267 GameLook报道/ 6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次 ...

  5. 使用UE4公布安卓平台游戏

    使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...

  6. UE4 Windows平台部署游戏到IOS 第一部分

    UE4 Version 4.11.2 or 4.12.2 方法步骤: 1.申请IOS开发者账号,大概三个工作日左右激活. 2.下载iTunes 3.创建项目因为是在Windows平台,根据官方的提示只 ...

  7. [UE4]纯函数的执行时机

    一.纯函数是在需要的时候被调用 二.纯函数内不应当修改任何数据 三.如果同一个函数需要多个得到多个纯函数的返回值,则多个纯函数的调用顺序不是固定的,并且一个纯函数的调用顺序也不应当影响下一个纯函数的返 ...

  8. UE4虚幻引擎独立游戏制作教程 UE4编程教学 虚幻引擎4

    非常好的一套UE4入门教学课程,语言诙谐幽默,并且是中文语音中文语音中文语音 赠送[精通Unreal引擎技术——关卡设计艺术]PDF版 目录 FLV格式,大小5G,中文语音 扫码时备注或说明中留下邮箱 ...

  9. UE4 Windows平台部署游戏到IOS 第二部分

    点击加号后会出来如下截图 勾选上红色单选框处(因为这个我已经申请过了所以是灰色),然后continue到后面会出现下图 选择一个之前我提到申请证书会用的的那个.csr后缀文件夹,完成以后就可以下载证书 ...

  10. UE4 游戏中csv配置文件使用

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/76549463 作者:ca ...

随机推荐

  1. IoTSharp:基于 .NET 8.0 的开源物联网平台

    前言 想要快速了解物联网的世界吗?如果你对物联网(IoT)感兴趣,或者正打算开发自己的物联网项目.可以试试 IoTSharp,一个基于 .NET 的开源平台. 无论你是初学者还是有经验的大佬,IoTS ...

  2. LaTeX 书写函数

    \[\text{text 模式} \] \[\mathrm{mathrm 模式} \] \[\textit{textit 模式} \] \[\operatorname{operatorname 模式} ...

  3. 使用 AWS CLI 管理 S3

    S3 是 AWS 的对象存储服务 S3: Simple Storage Service 创建桶 使用 aws s3 mb 命令创建新的 S3 桶.您需要提供一个全球唯一的桶名称和创建桶的区域. aws ...

  4. 【Mac + Appium + Java1.8(一)】之Android自动化环境安装配置以及IDEA配置(附录扩展Selenium+Java自动化)

    配置环境: MacOS:10.13.6 java:1.8 IntelliJ IDEA:2018.3 Android SDK:25 Appium:1.9.1 Appium-desktop:1.7.1 j ...

  5. bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT

    bug记录|NON-STATIC METHOD CANNOT BE REFERENCED FROM A STATIC CONTEXT   问题:原因:静态方法无法调用自己定义的非静态方法 解决方案:1 ...

  6. 编译和分发 Chez Scheme 应用程序

    参考 Building and Distributing Applications. 假设源码由两个文件组成,A.ss 和 B.ss,其中 A.ss 依赖 B.ss.下面我们将其编译为可供分发的二进制 ...

  7. WebRTC 简单入门与实践

    一.前言 WebRTC 技术已经广泛在各个行业及场景中被应用,但对多数开发者来说,实时音视频及相关技术却是比较不常接触到的. 做为一名 Web 开发者,WebRTC 这块的概念着实花了不少时间才搞明白 ...

  8. ASP.NET Core – Minimal API

    介绍 Minimal API 是 .NET 6 才开始有的功能. 它是一个简化版本的 Web API. 我还没有认真的去学习它, 感觉它走的是 Node.js Express 的路线. 目前用它来写小 ...

  9. ASP.NET Core – Handle Error on Web API

    前言 上一篇讲了 ASP.NET Core – Handle Error on Razor Page 这一篇继续说说 Web API 的错误处理. 主要参考 Handle errors in ASP. ...

  10. Qt连连看(一)需求分析

    虽然开发经验并不多,但是结合以往的一点实践项目和理论学习,自认为不管是开发什么工程项目,只要遵循软件工程的构建原则,如选择一个合理的架构体系,再掌握一门语言,利用数据结构组织数据,算法实现想法和功能, ...