一、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容器的更多相关文章

  1. UE4中的集合:TSet容器

    好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...

  2. 3D游戏开发之UE4中的集合:TSet容器

    好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...

  3. [UE4]单映射:TMap容器,字典表

    一.TMap是什么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的. 二.创建和填充单映射 如果你想创建一 ...

  4. UE4 中的 C++ 编程介绍

    https://docs.unrealengine.com/latest/CHN/Programming/Introduction/index.html UE4 中的 C++ 编程介绍 Unreal ...

  5. Docker入门之六端口映射与容器互联

    一.端口映射 在之前的博客搭建私有仓库时用到这样一句:docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry来r ...

  6. UE4中C++编程(一)

    一: C++工程和Gameplay框架 GameInstance 它适合放置独立于关卡的信息,比如说显示UI. GameMode 表示游戏玩法, 包含游戏进行的规则和胜利条件等等信息,游戏模式是和关卡 ...

  7. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  8. UE4中使用数据表(Data Table)

    本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中 ...

  9. 5.2:缓存中获取单例bean

    5.2  缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...

随机推荐

  1. iOS开发UITableView基本使用方法总结

    本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDa ...

  2. mongodb 导入数据库文件

    吐槽一下:  这个导入现有数据文件弱爆了... 直接将要导入的数据文件放到mongodb下的db目录下就完事了...O(∩_∩)O哈哈~ 例如: 将shop_suning (shopdb_suning ...

  3. 命名空间“Microsoft.AspNet”中不存在类型或命名空间名“Mvc”

    问题: 错误 CS0234 命名空间"Microsoft.AspNet"中不存在类型或命名空间名"Mvc"(是否缺少程序集引用?) 解决方案: 打开文件夹 Us ...

  4. 为什么ajax 必须同源,same origin policy

    ajax 所有请求都会附带主域的cookie, 若没有同源策略,攻击者就可以获取你的cookie,状态.

  5. Poi之Word文档结构介绍

    1.poi之word文档结构介绍之正文段落 一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元 获取所有段落:List<XWPFParagraph ...

  6. 按ctrl + c 播放下一曲音乐

    ./a.out . #include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<dirent. ...

  7. MI & CI

    目前,很多特征选择文献主要是依据对共信息的直观认识使用它,即:正值表示表型的存在使特征间依赖程度增加,是特征间存在相互作用的证据:负值表示表型的存在使特征间冗余性增加:零表示特征是相互独立的,或者说, ...

  8. Bootstrap3写的红色警告框样式组件

    用的是BT3的类和fa的图标 <!DOCTYPE html><html><head lang="en">    <meta charset ...

  9. 给 Memo 排序的函数

    本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  10. jQuery 获取和设置type为hidden的input的值

    HTML代码 <input type="hidden" name="type" id="type" value="1&quo ...