UE4中的单映射:TMap容器
一、TMap<T>是么
TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每个键都是唯一的。类似C++中的Map.
二、创建和填充单映射
如果你想创建一种单映射关系,每一个角色的名称对应着价格:
TMap<FString, int32> charaPrice;
现在,让我们来添加角色名称和价格的单映射关系:
charaPrice.Add("皮城执法官", 6300 );
charaPrice.Add("皎月女神", 6300);
charaPrice.Add("暗影之拳", 3150);
charaPrice.Add("德玛西亚皇子", 4800);
三、迭代单映射
由于单映射的数据结构也不是线性关系,而是二叉树。因此一般情况下,我们也不能通过下标索引来迭代单映射。但是我们依然可以使用迭代器进行迭代(由此看出使用迭代器进行迭代可以使得各种容器的迭代操作保持一致):
for(TMap<FString, int>::TIterator it = charaPrice.CreateIterator(); it; ++it){
GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::White,
it->Key + FString(" 的出售价格为: ") + FString::FromInt(it->Value) + FString("金币。"));
}
注意的是,迭代器指向了单映射的每一个元素时,可以用key来取得元素的键,用Value来取得元素的值。
运行后可以看到输出结果:

四、代码展示
void ANPC::Prox_Implementation(AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex, bool bFromSweep, const FHitResult & sweepResult)
{
//通过强制转换成AAVatar是否成功来判断是否玩家角色
if (Cast<AAvatar>(otherActor) == nullptr)
{
return;
}
//获得第一人称控制器
APlayerController* PController = GetWorld()->GetFirstPlayerController();
if (PController)
{
//获得HUD界面
AMyHUD* hud = Cast<AMyHUD>(PController->GetHUD());
hud->AddMessage(Message(NpcMessage, 5.f, FColor::White));
//测试Map
TMap<FString, int32> charaPrice;
charaPrice.Add(L"皮城执法官", 6300);
charaPrice.Add(L"皎月女神", 6300);
charaPrice.Add(L"暗影之拳", 3150);
charaPrice.Add(L"德玛西亚皇子", 4800);
//在使用容器的时候,为了容器的操作一致性,通常都会像下面这样使用迭代器来循环
//所谓的迭代器其实类似于一个指针,当对指针进行++时,就指向后面的元素。
//当超出容器范围的时候,迭代器为空,跳出循环
for (TMap<FString, int32>::TIterator it = charaPrice.CreateIterator(); it; ++it)
{
//GEngine是全局引擎变量,我们使用它的AddOnScreenDebugMessage函数来在游戏屏幕上打印调试信息。
//该函数第一个参数是调试输出的位置,填写-1就不会覆盖以前的调试信息。
//第二个参数是字体大小,第三个参数是字体颜色,第四个参数是要打印的字符串,这里用FromInt函数将Int转换FString。
GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::White, it->Key + FString(L" 的出售价格为: ") + FString::FromInt(it->Value) + FString(L"金币。"));
}
}
}
现在我们学了最常用的三种容器,动态数组容器——TArray,集合容器——TSet还有单映射——TMap。当然还有各种各样的容器,它们的操作都是大同小异的。C++的泛型编程的优点也在于此,它们提供了相似的接口使得我们非常容易精通各种各样高效的容器。在游戏开发中,我们很少会重新写基本的数据结构类型,因为游戏引擎已经为我们提供好了大多数的数据结构。但是并不意味着没有必要学习数据结构,只有当你学习过数据结构,才能熟练地运用游戏引擎为我们提供的容器。这和我们的学习游戏引擎原理于使用游戏引擎的关系是一样的。所以建议大家,学习工具的同时,不要忘记了同时学习工具的原理哦!
学习累了,给大家放几张游戏中的图片:
德玛西亚皇子:

皮城执法官:

皎月女神:

今天就学到这吧!未完待续!
UE4中的单映射:TMap容器的更多相关文章
- UE4中的集合:TSet容器
好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...
- 3D游戏开发之UE4中的集合:TSet容器
好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...
- [UE4]单映射:TMap容器,字典表
一.TMap是什么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的. 二.创建和填充单映射 如果你想创建一 ...
- UE4 中的 C++ 编程介绍
https://docs.unrealengine.com/latest/CHN/Programming/Introduction/index.html UE4 中的 C++ 编程介绍 Unreal ...
- Docker入门之六端口映射与容器互联
一.端口映射 在之前的博客搭建私有仓库时用到这样一句:docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry来r ...
- UE4中C++编程(一)
一: C++工程和Gameplay框架 GameInstance 它适合放置独立于关卡的信息,比如说显示UI. GameMode 表示游戏玩法, 包含游戏进行的规则和胜利条件等等信息,游戏模式是和关卡 ...
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- UE4中使用数据表(Data Table)
本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中 ...
- 5.2:缓存中获取单例bean
5.2 缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...
随机推荐
- 数据结构-String、char
String 常用方法: 获取长度:int length = strl.length() 获取第i个字符:char iChar = str.charAt(i) String转成字符数组:char[] ...
- 【Xilinx-Petalinux学习】-08-OpenAMP系统实现
openAMP系统实现. 一个核跑Linux,一个核裸跑. -----> 已经实现. 一个核跑Linux,一个核跑UCOS -----> 还未实现. Micrium的uco ...
- phpmyadmin修改mysql数据库密码
甩上链接:http://jingyan.baidu.com/article/e4511cf332b9832b845eaf27.html
- 网站环境apache + php + mysql 的XAMPP,如何实现一个服务器上配置多个网站?
xampp 是一个非常方便的本地 apache + php + mysql 的调试环境,在本地安装测试 WordPress 等各种博客.论坛程序非常方便.今天我们来给大家介绍一下,如何使用 XAMPP ...
- HTML 布局
网站布局 大多数网站会把内容安排到多个列中(就像杂志或报纸那样). 大多数网站可以使用 <div> 或者 <table> 元素来创建多列.CSS 用于对元素进行定位,或者为页面 ...
- JSP EL表达式 获得 request的GET/POST方法
JSP EL表达式 获得 request的GET/POST方法: 不在requestScopse中: <p>得到request的方法</p> <p>pageCont ...
- Node.js理解
JavaScript单线程的误解 在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求.而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无 ...
- 微信扫码下载APP
前段时间开发过程中,要实现一个扫描二维码下载APP的功能,但是苹果系统中,微信不可以直接跳转苹果商店,需要先下载应用宝,显然太麻烦... 这样我们可以做个中间页,用中间页面生成二维码链接,在中间页代码 ...
- SQL SERVER 运维日记-数据库备份
概述 昨天下午突然看到,<炉石传说>游戏数据库发生宕机并引发数据丢失事故的新闻.刚看到时,满满的不可思议.暴雪啊,网易啊. 都是很牛叉的公司.他们出的游戏我都是很喜欢的. 当我看到,第一时 ...
- Ubuntu14.04安装Go语言开发环境
1.使用apt-get命令来安装Go环境 apt-get install software-properties-common apt-get install python-software-prop ...