⛅️

【UE5】FObjectKeyを使ってUObjectをTMapのKeyにしよう

2024/11/09に公開

概要

実装してる時、時折UObjectをKeyにしたいときがありました。

ただ、そのままだとKeyに出来なくてわざわざKeyをIntなどKeyに出来るもので実装していました。

今回それを可能にしてくれる、FObjectKeyという存在を知ったので、それについて記載をしようと思います。

環境

UE5.4.4

FObjectKeyとは

簡単に言うと、コンストラクタにUObjectを入れるとTMapのKeyとして使える形にしてくれる構造体です。
実装の中身は以下のようになっています。

Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectKey.h
FORCEINLINE FObjectKey(const UObject* Object)
		: ObjectIndex(UE::Core::Private::InvalidWeakObjectIndex)
		, ObjectSerialNumber(0)
{
    if (Object)
    {
        FWeakObjectPtr Weak(Object);
        ObjectIndex = Weak.ObjectIndex;
        ObjectSerialNumber = Weak.ObjectSerialNumber;
    }
}
//以下Operatorが続きますが長いので省きます//TypeHashがあるのでTMapのKeyに使える…!
friend uint32 GetTypeHash(const FObjectKey& Key)
{
    return HashCombine(Key.ObjectIndex, Key.ObjectSerialNumber);
}

中身を見る限り、便利そうですね。
自分でハッシュ値を求める計算を書かなくて済むのはありがたいですね。

見つけた方法

先日、LyraというUE5の公式サンプルを見ていて見慣れないStructがありました。

UAbilityTask_GrantNearbyInteraction.cpp
FObjectKey ObjectKey(Option.InteractionAbilityToGrant); //GameplayAbilityのポインタを渡してる…?
if (!InteractionAbilityCache.Find(ObjectKey))
{
    FGameplayAbilitySpec Spec(Option.InteractionAbilityToGrant, 1, INDEX_NONE, this);
    FGameplayAbilitySpecHandle Handle = AbilitySystemComponent->GiveAbility(Spec);
    InteractionAbilityCache.Add(ObjectKey, Handle); //TMapにAddしてるっぽい…
}

これがなにか調べた所、便利そうだなと思い、今回の記事を書いた次第です。

誰かの役に立てれば幸いです。

参考

How to use a PrimaryDataAsset as a key in a TMap?

Discussion