前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE4中的单映射:TMap容器

UE4中的单映射:TMap容器

作者头像
用户1198337
发布2018-01-19 11:24:21
1.7K0
发布2018-01-19 11:24:21
举报
文章被收录于专栏:我有一个梦想我有一个梦想

一、TMap<T>是么

TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每个键都是唯一的。类似C++中的Map.

二、创建和填充单映射

如果你想创建一种单映射关系,每一个角色的名称对应着价格:

代码语言:javascript
复制
TMap<FString, int32> charaPrice;

 现在,让我们来添加角色名称和价格的单映射关系:

代码语言:javascript
复制
charaPrice.Add("皮城执法官", 6300 );
charaPrice.Add("皎月女神", 6300);
charaPrice.Add("暗影之拳", 3150);
charaPrice.Add("德玛西亚皇子", 4800);

 三、迭代单映射

由于单映射的数据结构也不是线性关系,而是二叉树。因此一般情况下,我们也不能通过下标索引来迭代单映射。但是我们依然可以使用迭代器进行迭代(由此看出使用迭代器进行迭代可以使得各种容器的迭代操作保持一致):

代码语言:javascript
复制
    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来取得元素的值。

运行后可以看到输出结果:

四、代码展示

代码语言:javascript
复制
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++的泛型编程的优点也在于此,它们提供了相似的接口使得我们非常容易精通各种各样高效的容器。在游戏开发中,我们很少会重新写基本的数据结构类型,因为游戏引擎已经为我们提供好了大多数的数据结构。但是并不意味着没有必要学习数据结构,只有当你学习过数据结构,才能熟练地运用游戏引擎为我们提供的容器。这和我们的学习游戏引擎原理于使用游戏引擎的关系是一样的。所以建议大家,学习工具的同时,不要忘记了同时学习工具的原理哦!

学习累了,给大家放几张游戏中的图片:

德玛西亚皇子:

皮城执法官:

皎月女神:

今天就学到这吧!未完待续!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、TMap<T>是么
  • 二、创建和填充单映射
  •  三、迭代单映射
  • 四、代码展示
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档