UE4纯C++实现游戏快捷栏之物品读取
我们在上一步骤中创建了快捷栏的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++实现游戏快捷栏之物品读取的更多相关文章
- WPF编游戏系列 之三 物品清单
原文:WPF编游戏系列 之三 物品清单 本篇将介绍如何通过C#自动生成游戏界面,主要演示点击"My Shop"后如何显示所有物品清单.其中数据源来自于Access 2 ...
- UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合
前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发. UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fr ...
- Unity3D游戏开发——显示物品的仓库UI
访问仓库物品列表的方法 为了在UI中显示物品列表,我们需要给InventoryManager添加两个能够访问它的公有方法: 代码: ··· public List<string> GetI ...
- 张瀚荣:如何用UE4制作3D动作游戏
转自:http://www.gamelook.com.cn/2015/06/218267 GameLook报道/ 6月5日,2015年第三期GameLook开放日‧虚幻引擎专场活动在上海正式举行,此次 ...
- 使用UE4公布安卓平台游戏
使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...
- UE4 Windows平台部署游戏到IOS 第一部分
UE4 Version 4.11.2 or 4.12.2 方法步骤: 1.申请IOS开发者账号,大概三个工作日左右激活. 2.下载iTunes 3.创建项目因为是在Windows平台,根据官方的提示只 ...
- [UE4]纯函数的执行时机
一.纯函数是在需要的时候被调用 二.纯函数内不应当修改任何数据 三.如果同一个函数需要多个得到多个纯函数的返回值,则多个纯函数的调用顺序不是固定的,并且一个纯函数的调用顺序也不应当影响下一个纯函数的返 ...
- UE4虚幻引擎独立游戏制作教程 UE4编程教学 虚幻引擎4
非常好的一套UE4入门教学课程,语言诙谐幽默,并且是中文语音中文语音中文语音 赠送[精通Unreal引擎技术——关卡设计艺术]PDF版 目录 FLV格式,大小5G,中文语音 扫码时备注或说明中留下邮箱 ...
- UE4 Windows平台部署游戏到IOS 第二部分
点击加号后会出来如下截图 勾选上红色单选框处(因为这个我已经申请过了所以是灰色),然后continue到后面会出现下图 选择一个之前我提到申请证书会用的的那个.csr后缀文件夹,完成以后就可以下载证书 ...
- UE4 游戏中csv配置文件使用
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/76549463 作者:ca ...
随机推荐
- 【CMake系列】06-项目结构与输出路径管理
为了对大型项目实现更好的管理[模块化协作开发等等],cmake 提供了很多指令,可以对项目的结构进行调整.管理,便于项目的合理规划.本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设 ...
- Mac 删除 Steam 游戏图标
Steam 将游戏安装在了 ~/Applications,打开访达,前往该目录,将相关游戏移到废纸篓.
- C#自定义控件—转换开关
C#用户控件之转换开关 如何自定义一个转换键(Toggle)? 三步绘制一个精美控件: 定义属性: 画布重绘: 添加事件: 主要技能: 如何自定义属性: 画布重绘的一般格式: 控件的事件触发过程: 技 ...
- sentinel 的限流规则及流量控制
sentinel 前方参考 计算QPS-Sentinel限流算法 https://www.cnblogs.com/yizhiamumu/p/16819497.html Sentinel 介绍与下载使用 ...
- containerd 拉取k8s.gcr.io/pause镜像i/o timeout
由于k8s.gcr.io 需要连外网才可以拉取到,导致 k8s 的基础容器 pause 经常无法获取.k8s docker 可使用代理服拉取,再利用 docker tag 解决问题 docker pu ...
- c程序设计语言 by K&R(二)指针与数组
指针与数组 1. c语言只有值传递,没有引用传递 可通过指针交换 #include <stdio.h> #include <stdlib.h> void swap(int* a ...
- Redis 入门 - 五大基础类型及其指令学习
经过前面Redis入门系列三篇文章学习,相信大家已经准备好学习新知识了,到这里也算是真正开始学习Redis了.学习了软件安装,客户端选择,那么接下来也应该来了解Redis有什么,能干什么. 我们在第一 ...
- 使用.NET并行任务库(TPL)与并行Linq(PLINQ)充分利用多核性能
前言 最近比较闲,(项目要转Java被分到架构组,边缘化人员,无所事事 哈哈哈哈) 记录一下前段时间用到的.NET框架下采用并行策略充分利用多核CPU进行优化的一个方法 起因是项目中有个结算的方法,需 ...
- 填坑 CentOS7 使用 Python3 安装 Cython 编写扩展
前文参见 <CentOS 7 下通过 Cython 编写 python 扩展>, 用的是 Python2.7,本文用的是 Python3.6 yum install python3 pyt ...
- BC1.2和PD 充电的区别
USB Battery Charging Specification 1.2(BC1.2)和 USB Power Delivery(USB PD)是两个不同的充电标准,它们在应用场景.充电能力.充电协 ...