UE4 C++ 特定の階層下のGameplayTagを判定する(ごり押し)
やあ
タイトルの通りだよ。
特定のタグ階層下のGameplayAbility
が呼び出されたときに、処理をしようと思ったんだけど、MatchesAny
やMatchesAnyExact
では判定できなかった(使い方がわるいのかもですが)から、ごり押しで判定することにしたよ。
やるだけですが。
もっといい方法などありましたら教えていただけますと助かります。
やるだけです
bool AHoge::Huga( FGameplayTagContainer AbilityTag ) { for (const FGameplayTag& Tag : AbilityTag) { TArray<FString> ParsedRes = {}; FString TagName = Tag.GetTagName().ToString(); TagName.ParseIntoArray(ParsedRes, TEXT(".")); int32 IsMatched = 0; for (FString ParsedTag : ParsedRes) { if (ParsedTag == TEXT("Hierarchy1")) ++IsMatched; if (ParsedTag == TEXT("Hierarchy2")) { if (IsMatched > 0) { UE_LOG(LogTemp, Log, TEXT("This ability is Hierarchy1.Hierarchy2")); return true; } break; } } } return false; };
一応、GameplayTagが引数の時のも。
bool AHoge::Huga( FGameplayTag AbilityTag ) { TArray<FString> ParsedRes = {}; AbilityTag.ParseIntoArray(ParsedRes, TEXT(".")); int32 IsMatched = 0; for (FString ParsedTag : ParsedRes) { if (ParsedTag == TEXT("Hierarchy1")) ++bIsMatched; if (ParsedTag == TEXT("Hierarchy2")) { if (IsMatched > 0) { UE_LOG(LogTemp, Log, TEXT("This ability is Hierarchy1.Hierarchy2")); return true; } break; } } return false; };
汎用化?(引数にGameplayTagContainer)
bool AHoge::CheckGameplayTagContainerUnderHierarchy( const TArray<FString>& Hierarchy, const FGameplayTagContainer& TagContainerToCheck ) const { int32 CheckedHierarchy = Hierarchy.Num() - 1; if (CheckedHierarchy < 0) return false; for (const FGameplayTag& Tag : TagContainerToCheck) { TArray<FString> ParsedRes = {}; FString TagName = Tag.GetTagName().ToString(); TagName.ParseIntoArray(ParsedRes, TEXT(".")); int32 IsMatched = 0; for (const FString& ParsedTag : ParsedRes) { if (CheckedHierarchy < IsMatched) break; if (ParsedTag == Hierarchy[IsMatched]) ++IsMatched; if (IsMatched > CheckedHierarchy - 1) { return true; } } } return false; }
引数Hierarchy
に求めたい階層通りの順番に入れないといけないんだけど、これで十分だと思う。
脳みそからっぽで書いたから、間違ってたら教えてね。
汎用化?(引数にGamepalyTag)
bool AHoge::CheckGameplayTagUnderHierarchy( const TArray<FString>& Hierarchy, const FGameplayTag& TagToCheck ) const { int32 CheckedHierarchy = Hierarchy.Num() - 1; if (CheckedHierarchy < 0) return false; TArray<FString> ParsedRes = {}; FString TagName = TagToCheck.GetTagName().ToString(); TagName.ParseIntoArray(ParsedRes, TEXT(".")); int32 IsMatched = 0; for (const FString& ParsedTag : ParsedRes) { if (CheckedHierarchy < IsMatched) break; if (ParsedTag == Hierarchy[IsMatched]) ++IsMatched; if (IsMatched > CheckedHierarchy - 1) { return true; } } return false; }
やってることは同じだよ。