in Ambit/Source/Ambit/Utils/AmbitWorldHelpers.cpp [37:82]
TArray<AActor*> AmbitWorldHelpers::GetActorsByMatchBy(const EMatchBy& MatchBy, const FString& NamePattern,
const TArray<FName>& TagsList, const bool bMatchExactName)
{
TArray<AActor*> AllActors;
UGameplayStatics::GetAllActorsOfClass(GEngine->GetWorldContexts()[0].World(), AActor::StaticClass(), AllActors);
// Filter actors to just those matching criteria.
bool bNamePatternIsEmpty = NamePattern.IsEmpty();
bool bTagsListIsEmpty = TagsList.Num() == 0;
return AllActors.FilterByPredicate(
[MatchBy, NamePattern, TagsList, bNamePatternIsEmpty, bTagsListIsEmpty, bMatchExactName](const AActor* Actor)
{
// if name pattern is empty, default to false. Else match to the name pattern.
bool bMatchesName = false;
if (!bNamePatternIsEmpty && (bMatchExactName && Actor->GetName() == NamePattern || Actor->GetName().
Contains(NamePattern)))
{
bMatchesName = true;
}
// if the tags list is empty, default to false. Else match to tags.
bool bMatchesTags = !bTagsListIsEmpty;
for (FName Tag : TagsList)
{
if (!Actor->Tags.Contains(Tag))
{
bMatchesTags = false;
break;
}
}
switch (MatchBy)
{
case EMatchBy::NameAndTags:
return bMatchesName && bMatchesTags;
case EMatchBy::NameOrTags:
return bMatchesName || bMatchesTags;
default:
return false;
}
});
}