【UE5】マップの基本【C++】

学んだこと、試したこと、気づいたことをまとめています。

はじめに

Key(キー)とValue(値)で管理するデータ構造。
👇なじみのない人はこちら。

https://wa3.i-3-i.info/word11947.html

KeyとValueのペアの配列
特徴
・検索しやすい
・Keyは重複できない
👇参照動画

【UE4/UE5ゲーム制作講座】超基礎編・これを見れば配列・マップ・セットがわかる!

記述の型

TMap<Keyの型, Valueの型> マップ名;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyActor")
	TMap<FName, float> Map;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyActor")
	TMap<FName, float> Map2;

面積(平方km)

基本操作

記述の型マップを書き換える

マップ.Add(Key, Value);

マップに要素を追加する。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	void MapAdd(UPARAM(ref) TMap<FName, float>& InMap, FName InName, float InFloat);

MyActor.cpp

void AMyActor::MapAdd(TMap<FName, float>& InMap, FName InName, float InFloat)
{
	InMap.Add(InName, InFloat);
}

記述の型マップを書き換える

マップ.Append(マップ);

はじめのマップを書き換えて、括弧の中のマップを追加する。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	void MapAppend(UPARAM(ref) TMap<FName, float>& InMap, TMap<FName, float> AppendMap);

MyActor.cpp

void AMyActor::MapAppend(TMap<FName, float>& InMap, TMap<FName, float> AppendMap)
{
	InMap.Append(AppendMap);
}

記述の型整数値を返す

マップ.Num()

マップの要素数を返す。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	int32 MapLength(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

int32 AMyActor::MapLength(TMap<FName, float>& InMap)
{
	return InMap.Num();
}

記述の型Valueを返す

マップ[Key]

キーの値を返す。Findとの違いはあまりよく分かっていない。

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	float MapGet(UPARAM(ref) TMap<FName, float>& InMap, FName InName);

MyActor.cpp

float AMyActor::MapGet(TMap<FName, float>& InMap, FName InName)
{
	return InMap[InName];
}

マップからKeyを抜き出した配列をつくる。

記述の型配列を書き換える。

マップ.GetKeys(配列);

マップのキーを配列に代入。たぶん。GenerateKeyArrayでも同じかも。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	TArray<FName> MapKeys(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

TArray<FName> AMyActor::MapKeys(TMap<FName, float>& InMap)
{
	TArray<FName> MapKeys;
	InMap.GetKeys(MapKeys);
	return MapKeys;
}

神奈川と出力

マップからValueを抜き出した配列をつくる。

記述の型配列を書き換える。

マップ.GenerateValueArray(配列);

マップのValueを配列に代入。おそらく。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	TArray<float> MapValues(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

TArray<float> AMyActor::MapValues(TMap<FName, float>& InMap)
{
	TArray<float> MapValues;
	InMap.GenerateValueArray(MapValues);
	return MapValues;
}

記述の型ブール値を返す

マップ.Contains(Key)

キーがあればtrue、なければfalseを返す。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	bool MapContains(UPARAM(ref) TMap<FName, float>& InMap, FName InName);

MyActor.cpp

bool AMyActor::MapContains(TMap<FName, float>& InMap, FName InName)
{
	if (InMap.Contains(InName))
	{
		return true;
	}
	else
	{
		return false;
	}
}

記述の型値を返す

マップ.Find(Key)

Keyに対応したValue(ポインタ)を返す。Getを使うべきところでFindを使ってみたらエラーがでた。Findはポインタ変数に突っ込むときに使うものだと認識しておく。
(cannot convert from ‘ValueType *’ to ‘float’)

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	bool MapFind(UPARAM(ref) TMap<FName, float>& InMap, FName InName, float& Value);

MyActor.cpp

bool AMyActor::MapFind(TMap<FName, float>& InMap, FName InName, float& Value)
{
	const float* ValPtr = InMap.Find(InName);

	if (ValPtr)
	{
		Value = *ValPtr;
		return true;
	}
	else
	{
		Value = 0.0;
		return false;
	}
}

ポインタを使っているから、if文の中で使えるのかも。nullptrでなければtrueなのかな。

記述の型マップを書き換える

マップ.Remove(Key);

マップから指定したキーの要素を取り除く。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	bool MapRemove(UPARAM(ref) TMap<FName, float>& InMap, FName InName);

MyActor.cpp

bool AMyActor::MapRemove(TMap<FName, float>& InMap, FName InName)
{
	if (InMap.Contains(InName))
	{
		InMap.Remove(InName);
		return true;
	}
	else
	{
		return false;
	}
}

記述の型マップを書き換える。

マップ.Empty();

マップから全ての要素を取り除く。

MyActor.h

UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
	void MapClear(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

void AMyActor::MapClear(TMap<FName, float>& InMap)
{
	InMap.Empty();
}

イテレーション

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	float MapSum(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

float AMyActor::MapSum(TMap<FName, float>& InMap)
{
	float Sum = 0.0;
	TArray<FName> Keys;
	InMap.GetKeys(Keys);
	int Num = Keys.Num();
	for(int32 i = 0; i < Num; i++)
	{
		FName Key = Keys[i];
		Sum += InMap[Key];
	}
	return Sum;
}

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	float MapSum2(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

float AMyActor::MapSum2(TMap<FName, float>& InMap)
{
	float Sum = 0.0;
	for (const TPair<FName, float>& Pair : InMap)
	{
		Sum += Pair.Value;
	}
	return Sum;
}

MyActor.h

UFUNCTION(BlueprintPure, Category = "Actor Functions")
	float MapSum3(UPARAM(ref) TMap<FName, float>& InMap);

MyActor.cpp

float AMyActor::MapSum3(TMap<FName, float>& InMap)
{
	float Sum = 0.0;
	for (auto It = InMap.CreateIterator(); It; ++It)
	{
		Sum += It.Value();
	}
	return Sum;
}

その他

👇ポインタの理解に役に立ちそうなコード。

TMap<int32, AMyActor*> MyActorMap;

AMyActor** MyActorPtr = AMyActorMap.Find(Key);
AMyActor* MyActor = *MyActorPtr;

OR

AMyActor* MyActor = *AMyActorMap.Find(Key);

if(MyActor)
{
MyActor->MyFunc();
}

Findは、値にポインタを返す。
少しだけ分かってきた気がする。
AMyActor*などは、もともとポインタクラス。

デリファレンス。
参照先のデータを取得する。
👇たぶん、こういうやつ。

*MyActroPtr

https://wa3.i-3-i.info/word12818.html

👇参考動画

UE4 – Blueprints to C++ Episode 0 – Introduction

Twitterしてます

ブログの更新をお知らせ

コメント

タイトルとURLをコピーしました