一、TMap是什么
TMap是UE4中的一種關聯容器,每個鍵都關聯着一個值,形成了單映射關系。因此你可以通過鍵名來快速查找到值。此外,單映射要求每個鍵都是唯一的。
二、創建和填充單映射
如果你想創建一種單映射關系,每一個角色的名稱對應着價格:
TMap charaPrice;
現在,讓我們來添加角色名稱和價格的單映射關系:
charaPrice.Add("皮城執法官", 6300 ); charaPrice.Add("皎月女神", 6300); charaPrice.Add("暗影之拳", 3150); charaPrice.Add("德瑪西亞皇子", 4800);
這樣就完成了填充單映射,之后,你可以很方便地使用charaPrice[“暗影之拳”]來取得這個角色的價格為3150金幣。
三、迭代單映射
由於單映射的數據結構也不是線性關系,而是二叉樹。因此一般情況下,我們也不能通過下標索引來迭代單映射。但是我們依然可以使用迭代器進行迭代(由此看出使用迭代器進行迭代可以使得各種容器的迭代操作保持一致):
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 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還有單映射——TSet。當然還有各種各樣的容器,它們的操作都是大同小異的。C++的泛型編程的優點也在於此,它們提供了相似的接口使得我們非常容易精通各種各樣高效的容器。在游戲開發中,我們很少會重新寫基本的數據結構類型,因為游戲引擎已經為我們提供好了大多數的數據結構。但是並不意味着沒有必要學習數據結構,只有當你學習過數據結構,才能熟練地運用游戲引擎為我們提供的容器。這和我們的學習游戲引擎原理於使用游戲引擎的關系是一樣的。所以建議大家,學習工具的同時,不要忘記了同時學習工具的原理哦!
