UE4中的单映射:TMap容器

一、TMap是什么

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

二、创建和填充单映射

如果你想创建一种单映射关系,每一个角色的名称对应着价格:
TMap charaPrice;
现在,让我们来添加角色名称和价格的单映射关系:
charaPrice.Add("皮城执法官", 6300 );
charaPrice.Add("皎月女神", 6300);
charaPrice.Add("暗影之拳", 3150);
charaPrice.Add("德玛西亚皇子", 4800);
这样就完成了填充单映射,之后,你可以很方便地使用charaPrice[“暗影之拳”]来取得这个角色的价格为3150金币。

三、迭代单映射

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

    
    
  1. for(TMap<FString, int>::TIterator it = charaPrice.CreateIterator(); it; ++it){
  2. GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::White,
  3. it->Key + FString(" 的出售价格为: ") + FString::FromInt(it->Value) + FString("金币。"));
  4. }
注意的是,迭代器指向了单映射的每一个元素时,可以用key来取得元素的键,用Value来取得元素的值。

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

四、代码展示


    
    
  1. void ANPC::Prox_Implementation(AActor* otherActor, UPrimitiveComponent* otherComp, int32 otherBodyIndex, bool bFromSweep, const FHitResult & sweepResult)
  2. {
  3. //通过强制转换成AAVatar是否成功来判断是否玩家角色
  4. if (Cast<AAvatar>(otherActor) == nullptr)
  5. {
  6. return;
  7. }
  8. //获得第一人称控制器
  9. APlayerController* PController = GetWorld()->GetFirstPlayerController();
  10. if (PController)
  11. {
  12. //获得HUD界面
  13. AMyHUD* hud = Cast<AMyHUD>(PController->GetHUD());
  14. hud->AddMessage(Message(NpcMessage, 5.f, FColor::White));
  15. //测试Map
  16. TMap charaPrice;
  17. charaPrice.Add(L"皮城执法官", 6300);
  18. charaPrice.Add(L"皎月女神", 6300);
  19. charaPrice.Add(L"暗影之拳", 3150);
  20. charaPrice.Add(L"德玛西亚皇子", 4800);
  21. //在使用容器的时候,为了容器的操作一致性,通常都会像下面这样使用迭代器来循环
  22. //所谓的迭代器其实类似于一个指针,当对指针进行++时,就指向后面的元素。
  23. //当超出容器范围的时候,迭代器为空,跳出循环
  24. for (TMap<FString, int32>::TIterator it = charaPrice.CreateIterator(); it; ++it)
  25. {
  26. //GEngine是全局引擎变量,我们使用它的AddOnScreenDebugMessage函数来在游戏屏幕上打印调试信息。
  27. //该函数第一个参数是调试输出的位置,填写-1就不会覆盖以前的调试信息。
  28. //第二个参数是字体大小,第三个参数是字体颜色,第四个参数是要打印的字符串,这里用FromInt函数将Int转换FString。
  29. GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::White, it->Key + FString(L" 的出售价格为: ") + FString::FromInt(it->Value) + FString(L"金币。"));
  30. }
  31. }
  32. }
现在我们学了最常用的三种容器,动态数组容器——TArray,集合容器——TSet还有单映射——TSet。当然还有各种各样的容器,它们的操作都是大同小异的。C++的泛型编程的优点也在于此,它们提供了相似的接口使得我们非常容易精通各种各样高效的容器。在游戏开发中,我们很少会重新写基本的数据结构类型,因为游戏引擎已经为我们提供好了大多数的数据结构。但是并不意味着没有必要学习数据结构,只有当你学习过数据结构,才能熟练地运用游戏引擎为我们提供的容器。这和我们的学习游戏引擎原理于使用游戏引擎的关系是一样的。所以建议大家,学习工具的同时,不要忘记了同时学习工具的原理哦!
### UE5 中变量类型集合与数组映射 #### 数组的定义和使用 在 Unreal Engine 5 (UE5) 中,数组是一种常用的数据结构,允许存储多个相同类型的元素。通过特定的编辑器图标来识别并操作这些数组是非常直观的操作[^2]。 当声明一个数组时,可以在变量类型的右侧看到一个小方块组成的图标,点击该图标即可将其转换成数组形式。例如: ```cpp UPROPERTY(EditAnywhere, BlueprintReadWrite) TArray<int32> MyIntegerArray; ``` 这段代码展示了如何定义一个整数类型的数组 `MyIntegerArray` 并赋予其属性标签以便于编辑器中的访问和修改。 #### 集合类(Set 和 Map) 除了基本的数组外,UE5 还支持更复杂的容器类型如 Set 和 TMap(即字典),它们提供了不同的功能特性以满足多样化的编程需求[^4]。 - **Set**: 存储唯一值而不考虑顺序; - **TMap/字典**: 键值对的形式保存数据,其中键是唯一的而值可以重复。相比于简的线性查找,利用哈希表机制实现了更快的速度优势;但是需要注意的是,一旦设置了键值对,则无法直接更改键本身,除非删除再重建新的条目。 对于某些场景下,比如需要频繁查询某项记录是否存在或是按照关键字快速检索关联信息时,采用 TMap 就显得尤为合适了。 #### 实际应用案例对比 考虑到实际项目里的具体应用场景,假设要管理一组角色技能配置文件,那么可以选择如下方式之一来进行设计: - 如果只需要维护一份有序列表,并且不介意可能存在重复项的话,就可以简地选用 TArray 来完成任务。 - 当希望确保每种能力仅能被添加一次而且不在乎内部排列次序的情况下,此时应该优先考虑使用 TSet 类型。 - 若涉及到更为复杂的关系模型——例如每个动作都对应着独特的触发条件或者其他参数设定,这时就非常适合运用到 TMap 结构,因为它能够高效地建立起一对一或多对多之间的联系关系。 综上所述,在选择合适的容器之前应当充分理解各自的特点以及适用范围,从而做出最佳决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值