Open2

UE5:Lyraを参考にする際に気になったこと

PitekiPiteki

UE 5.1 の頃の Lyra を参考にしていた際に出た問題点など

PitekiPiteki

5.1 か 5.2 時代には LyraGameplayTags.h には FLyraGameplayTags という GameplayTag を定義する struct があり、AssetManager 経由で native な GameplayTag の登録が行われていた。

LyraGameplayTags.h (before)
/**
 * FLyraGameplayTags
 *
 *	Singleton containing native gameplay tags.
 */
struct FLyraGameplayTags
{
public:

	static const FLyraGameplayTags& Get() { return GameplayTags; }

	static void InitializeNativeTags();

	static FGameplayTag FindTagByString( FString TagString, bool bMatchPartialString = false );

public:

	FGameplayTag Ability_ActivateFail_IsDead;
	FGameplayTag Ability_ActivateFail_Cooldown;
	FGameplayTag Ability_ActivateFail_Cost;
	FGameplayTag Ability_ActivateFail_TagsBlocked;
	FGameplayTag Ability_ActivateFail_TagsMissing;
	FGameplayTag Ability_ActivateFail_Networking;
	FGameplayTag Ability_ActivateFail_ActivationGroup;

Tag を利用する側もこんな感じでシングルトンアクセスのような使い方になっている。

使う側
Payload.EventTag = FLyraGameplayTags::Get().GameplayEvent_Death;

でもこの InitializeNativeTags() の呼び出しタイミングが遅いのか、Editor の起動時にはいくつかの Tag が存在しないといったエラーがいつも発生している状態になっていた。


UE 5.4 あたりではこの FLyraGameplayTags という struct は廃止され、
namespace LyraGameplayTags の中で UE4 の ActionRPG でも使われていたUE_DECLARE_GAMEPLAY_TAG_EXTERN を使ったタグの定義に変更されている。

LyraGameplayTags.h (after)
namespace LyraGameplayTags
{
	LYRAGAME_API	FGameplayTag FindTagByString(const FString& TagString, bool bMatchPartialString = false);

	// Declare all of the custom native tags that Lyra will use
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_IsDead);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Cooldown);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Cost);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_TagsBlocked);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_TagsMissing);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_Networking);
	LYRAGAME_API	UE_DECLARE_GAMEPLAY_TAG_EXTERN(Ability_ActivateFail_ActivationGroup);

使う側もシンプルになった。

使う側
Payload.EventTag = LyraGameplayTags::GameplayEvent_Death;