Open2
UE5:Lyraを参考にする際に気になったこと
UE 5.1 の頃の Lyra を参考にしていた際に出た問題点など
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;