本文整理汇总了C++中FGameplayTag::IsValid方法的典型用法代码示例。如果您正苦于以下问题:C++ FGameplayTag::IsValid方法的具体用法?C++ FGameplayTag::IsValid怎么用?C++ FGameplayTag::IsValid使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FGameplayTag
的用法示例。
在下文中一共展示了FGameplayTag::IsValid方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: AddTag
void FGameplayTagContainer::AddTag(const FGameplayTag& TagToAdd)
{
SCOPE_CYCLE_COUNTER(STAT_FGameplayTagContainer_AddTag);
if (TagToAdd.IsValid())
{
// Don't want duplicate tags
GameplayTags.AddUnique(TagToAdd);
}
}
示例2: IsTagChecked
ECheckBoxState SGameplayTagWidget::IsTagChecked(TSharedPtr<FGameplayTagNode> Node) const
{
int32 NumValidAssets = 0;
int32 NumAssetsTagIsAppliedTo = 0;
if (Node.IsValid())
{
UGameplayTagsManager& TagsManager = IGameplayTagsModule::Get().GetGameplayTagsManager();
for (int32 ContainerIdx = 0; ContainerIdx < TagContainers.Num(); ++ContainerIdx)
{
FGameplayTagContainer* Container = TagContainers[ContainerIdx].TagContainer;
if (Container)
{
NumValidAssets++;
FGameplayTag Tag = TagsManager.RequestGameplayTag(Node->GetCompleteTag(), false);
if (Tag.IsValid())
{
if (Container->HasTag(Tag, EGameplayTagMatchType::Explicit, EGameplayTagMatchType::Explicit))
{
++NumAssetsTagIsAppliedTo;
}
}
}
}
}
if (NumAssetsTagIsAppliedTo == 0)
{
// Check if any children are tagged
for (auto It = Node->GetChildTagNodes().CreateConstIterator(); It; ++It)
{
if (IsTagChecked(*It) == ECheckBoxState::Checked)
{
return ECheckBoxState::Checked;
}
}
return ECheckBoxState::Unchecked;
}
else if (NumAssetsTagIsAppliedTo == NumValidAssets)
{
return ECheckBoxState::Checked;
}
else
{
return ECheckBoxState::Undetermined;
}
}
示例3: Serialize
bool FGameplayTagContainer::Serialize(FArchive& Ar)
{
const bool bOldTagVer = Ar.UE4Ver() < VER_UE4_GAMEPLAY_TAG_CONTAINER_TAG_TYPE_CHANGE;
if (bOldTagVer)
{
Ar << Tags_DEPRECATED;
}
else
{
Ar << GameplayTags;
}
if (Ar.IsLoading())
{
UGameplayTagsManager& TagManager = IGameplayTagsModule::GetGameplayTagsManager();
// If loading old version, add old tags to the new gameplay tags array so they can be saved out with the new version
// This needs to happen
// NOTE: DeprecatedTagNamesNotFoundInTagMap should be removed along with the bOldTagVer when we remove backwards
// compatibility, and the signature of RedirectTagsForContainer (below) should be changed appropriately as well.
TSet<FName> DeprecatedTagNamesNotFoundInTagMap;
if (bOldTagVer)
{
for (auto It = Tags_DEPRECATED.CreateConstIterator(); It; ++It)
{
const bool bErrorIfNotFound = false;
FGameplayTag Tag = TagManager.RequestGameplayTag(*It, bErrorIfNotFound);
if (Tag.IsValid())
{
TagManager.AddLeafTagToContainer(*this, Tag);
}
else
{ // For tags not found in the current table, add them to a list to be checked when handling
// redirection (below).
DeprecatedTagNamesNotFoundInTagMap.Add(*It);
}
}
}
// Rename any tags that may have changed by the ini file. Redirects can happen regardless of version.
// Regardless of version, want loading to have a chance to handle redirects
TagManager.RedirectTagsForContainer(*this, DeprecatedTagNamesNotFoundInTagMap);
}
return true;
}
示例4: LoadSettings
void FFrontendFilter_GameplayTags::LoadSettings(const FString& IniFilename, const FString& IniSection, const FString& SettingsString)
{
IGameplayTagsModule& GameplayTagModule = IGameplayTagsModule::Get();
TArray<FString> TagStrings;
GConfig->GetArray(*IniSection, *(SettingsString + TEXT(".Tags")), /*out*/ TagStrings, IniFilename);
TagContainer->RemoveAllTags();
for (const FString& TagString : TagStrings)
{
FGameplayTag NewTag = GameplayTagModule.RequestGameplayTag(*TagString, /*bErrorIfNotFound=*/ false);
if (NewTag.IsValid())
{
TagContainer->AddTag(NewTag);
}
}
}
示例5: BuildEditableContainerList
void FGameplayTagCustomization::BuildEditableContainerList()
{
EditableContainers.Empty();
if(StructPropertyHandle.IsValid())
{
TArray<void*> RawStructData;
StructPropertyHandle->AccessRawData(RawStructData);
TArray<UObject*> OuterObjects;
StructPropertyHandle->GetOuterObjects(OuterObjects);
FGameplayTag* Tag = (FGameplayTag*)(RawStructData[0]);
if (Tag->IsValid())
{
TagName = Tag->ToString();
TagContainer->AddTag(*Tag);
}
EditableContainers.Add(SGameplayTagWidget::FEditableGameplayTagContainerDatum(OuterObjects[0], TagContainer.Get()));
}
}
示例6: BuildEditableContainerList
void FGameplayTagCustomization::BuildEditableContainerList()
{
EditableContainers.Empty();
if(StructPropertyHandle.IsValid() && StructPropertyHandle->GetProperty())
{
TArray<void*> RawStructData;
StructPropertyHandle->AccessRawData(RawStructData);
if (RawStructData.Num() > 0)
{
FGameplayTag* Tag = (FGameplayTag*)(RawStructData[0]);
if (Tag->IsValid())
{
TagName = Tag->ToString();
TagContainer->AddTag(*Tag);
}
}
EditableContainers.Add(SGameplayTagWidget::FEditableGameplayTagContainerDatum(nullptr, TagContainer.Get()));
}
}
示例7: BuildCuesToAddToGlobalSet
void UGameplayCueManager::BuildCuesToAddToGlobalSet(const TArray<FAssetData>& AssetDataList, FName TagPropertyName, bool bAsyncLoadAfterAdd, TArray<FGameplayCueReferencePair>& OutCuesToAdd, FOnGameplayCueNotifySetLoaded OnLoaded, FShouldLoadGCNotifyDelegate ShouldLoad)
{
IGameplayTagsModule& GameplayTagsModule = IGameplayTagsModule::Get();
TArray<FStringAssetReference> AssetsToLoad;
AssetsToLoad.Reserve(AssetDataList.Num());
for (FAssetData Data: AssetDataList)
{
// If ShouldLoad delegate is bound and it returns false, don't load this one
if (ShouldLoad.IsBound() && (ShouldLoad.Execute(Data) == false))
{
continue;
}
const FString* FoundGameplayTag = Data.TagsAndValues.Find(TagPropertyName);
if (FoundGameplayTag && FoundGameplayTag->Equals(TEXT("None")) == false)
{
const FString* GeneratedClassTag = Data.TagsAndValues.Find(TEXT("GeneratedClass"));
if (GeneratedClassTag == nullptr)
{
ABILITY_LOG(Warning, TEXT("Unable to find GeneratedClass value for AssetData %s"), *Data.ObjectPath.ToString());
continue;
}
ABILITY_LOG(Log, TEXT("GameplayCueManager Found: %s / %s"), **FoundGameplayTag, **GeneratedClassTag);
FGameplayTag GameplayCueTag = GameplayTagsModule.GetGameplayTagsManager().RequestGameplayTag(FName(**FoundGameplayTag), false);
if (GameplayCueTag.IsValid())
{
// Add a new NotifyData entry to our flat list for this one
FStringAssetReference StringRef;
StringRef.SetPath(FPackageName::ExportTextPathToObjectPath(*GeneratedClassTag));
OutCuesToAdd.Add(FGameplayCueReferencePair(GameplayCueTag, StringRef));
AssetsToLoad.Add(StringRef);
}
else
{
ABILITY_LOG(Warning, TEXT("Found GameplayCue tag %s in asset %s but there is no corresponding tag in the GameplayTagManager."), **FoundGameplayTag, *Data.PackageName.ToString());
}
}
}
if (bAsyncLoadAfterAdd)
{
auto ForwardLambda = [](TArray<FStringAssetReference> AssetList, FOnGameplayCueNotifySetLoaded OnLoadedDelegate)
{
OnLoadedDelegate.ExecuteIfBound(AssetList);
};
if (AssetsToLoad.Num() > 0)
{
StreamableManager.RequestAsyncLoad(AssetsToLoad, FStreamableDelegate::CreateStatic( ForwardLambda, AssetsToLoad, OnLoaded));
}
else
{
// Still fire the delegate even if nothing was found to load
OnLoaded.ExecuteIfBound(AssetsToLoad);
}
}
}
示例8: BuildTagTranslationTable_r
bool FGameplayCueTranslationManager::BuildTagTranslationTable_r(const FName& TagName, const TArray<FName>& SplitNames)
{
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
if (CVarGameplyCueTranslatorDebugTag->GetString().IsEmpty() == false && TagName.ToString().Contains(CVarGameplyCueTranslatorDebugTag->GetString()))
{
//
UE_LOG(LogGameplayCueTranslator, Log, TEXT("....."));
}
#endif
bool HasValidRootTag = false;
TArray<FName> SwappedNames;
SwappedNames.Reserve(10);
// Every NameSwap Rule/Class that gave us data
for (FNameSwapData& NameSwapData : AllNameSwaps)
{
// Avoid rule recursion
{
if (FGameplayCueTranslatorNode* ChildNode = GetTranslationNodeForName(TagName, false))
{
if (ChildNode->UsedTranslators.Contains(NameSwapData.ClassCDO))
{
continue;
}
}
}
// Every Swap that this Rule/Class gave us
for (int32 SwapRuleIdx=0; SwapRuleIdx < NameSwapData.NameSwaps.Num(); ++SwapRuleIdx)
{
const FGameplayCueTranslationNameSwap& SwapRule = NameSwapData.NameSwaps[SwapRuleIdx];
#if WITH_EDITOR
if (SwapRule.EditorData.Enabled == false)
{
continue;
}
#endif
// Walk through the original tag's elements
for (int32 TagIdx=0; TagIdx < SplitNames.Num(); ++TagIdx)
{
// Walk through the potential new tag's elemnts
for (int32 ToNameIdx=0; ToNameIdx < SwapRule.ToNames.Num() && TagIdx < SplitNames.Num(); ++ToNameIdx)
{
// If they match
if (SwapRule.ToNames[ToNameIdx] == SplitNames[TagIdx])
{
// If we are at the end
if (ToNameIdx == SwapRule.ToNames.Num()-1)
{
// *Possible* tag translation found! This tag can be derived from out name swapping rules,
// but we don't know if there actually is a tag that matches the tag which it would be translated *from*
// Don't operator on SplitNames, since subsequent rules and name swaps use the same array
SwappedNames = SplitNames;
// Remove the "To Names" from the SwappedNames array, replace with the single "From Name"
// E.g, GC.{Steel.Master} -> GC.{Hero}
int32 NumRemoves = SwapRule.ToNames.Num(); // We are going to remove as many tags
int32 RemoveAtIdx = TagIdx - (SwapRule.ToNames.Num() - 1);
check(SwappedNames.IsValidIndex(RemoveAtIdx));
SwappedNames.RemoveAt(RemoveAtIdx, NumRemoves, false);
SwappedNames.Insert(SwapRule.FromName, RemoveAtIdx);
// Compose a string from the new name
FString ComposedString = SwappedNames[0].ToString();
for (int32 ComposeIdx=1; ComposeIdx < SwappedNames.Num(); ++ ComposeIdx)
{
ComposedString += FString::Printf(TEXT(".%s"), *SwappedNames[ComposeIdx].ToString());
}
UE_LOG(LogGameplayCueTranslator, Log, TEXT("Found possible expanded tag. Original Child Tag: %s. Possible Parent Tag: %s"), *TagName.ToString(), *ComposedString);
FName ComposedName = FName(*ComposedString);
// Look for this tag - is it an actual real tag? If not, continue on
{
FGameplayTag ComposedTag = TagManager->RequestGameplayTag(ComposedName, false);
if (ComposedTag.IsValid() == false)
{
UE_LOG(LogGameplayCueTranslator, Log, TEXT(" No tag match found, recursing..."));
FGameplayCueTranslatorNodeIndex ParentIdx = GetTranslationIndexForName( ComposedName, false );
if (ParentIdx.IsValid() == false)
{
ParentIdx = GetTranslationIndexForName( ComposedName, true );
check(ParentIdx.IsValid());
TranslationLUT[ParentIdx].UsedTranslators.Add( NameSwapData.ClassCDO );
HasValidRootTag |= BuildTagTranslationTable_r(ComposedName, SwappedNames);
}
}
else
{
HasValidRootTag = true;
}
//.........这里部分代码省略.........
示例9: ConstructGameplayTagTree
void UGameplayTagsManager::ConstructGameplayTagTree()
{
if (!GameplayRootTag.IsValid())
{
GameplayRootTag = MakeShareable(new FGameplayTagNode());
{
#if STATS
FString PerfMessage = FString::Printf(TEXT("UGameplayTagsManager::ConstructGameplayTagTree: Construct from data asset"));
SCOPE_LOG_TIME_IN_SECONDS(*PerfMessage, nullptr)
#endif
for (auto It(GameplayTagTables.CreateIterator()); It; It++)
{
if (*It)
{
PopulateTreeFromDataTable(*It);
}
}
}
if (ShouldImportTagsFromINI())
{
#if STATS
FString PerfMessage = FString::Printf(TEXT("UGameplayTagsManager::ConstructGameplayTagTree: ImportINI"));
SCOPE_LOG_TIME_IN_SECONDS(*PerfMessage, nullptr)
#endif
// Update path: Check for old tags in DefaultEngine.ini (we'll push them to the UGameplayTagSettings class).
TArray<FString> EngineConfigTags;
GConfig->GetArray(TEXT("/Script/GameplayTags.GameplayTagsSettings"), TEXT("GameplayTags"), EngineConfigTags, GEngineIni);
if (EngineConfigTags.Num() > 0)
{
UGameplayTagsSettings* MutableDefault = GetMutableDefault<UGameplayTagsSettings>();
if (MutableDefault->GameplayTags.Num() == 0)
{
MutableDefault->GameplayTags.Append(EngineConfigTags);
}
}
// Load any GameplayTagSettings from config (their default object)
for (TObjectIterator<UClass> ClassIt; ClassIt; ++ClassIt)
{
UClass* Class = *ClassIt;
if (!Class->IsChildOf<UGameplayTagsSettings>() || Class->HasAnyClassFlags(CLASS_Abstract))
{
continue;
}
#if WITH_EDITOR
Class->GetDefaultObject<UGameplayTagsSettings>()->SortTags();
#endif
for (FString TagStr : Class->GetDefaultObject<UGameplayTagsSettings>()->GameplayTags)
{
FGameplayTagTableRow TableRow;
TableRow.Tag = TagStr;
AddTagTableRow(TableRow);
}
}
GameplayRootTag->GetChildTagNodes().Sort(FCompareFGameplayTagNodeByTag());
}
if (ShouldUseFastReplication())
{
#if STATS
FString PerfMessage = FString::Printf(TEXT("UGameplayTagsManager::ConstructGameplayTagTree: Reconstruct NetIndex"));
SCOPE_LOG_TIME_IN_SECONDS(*PerfMessage, nullptr)
#endif
ConstructNetIndex();
}
{
#if STATS
FString PerfMessage = FString::Printf(TEXT("UGameplayTagsManager::ConstructGameplayTagTree: GameplayTagTreeChangedEvent.Broadcast"));
SCOPE_LOG_TIME_IN_SECONDS(*PerfMessage, nullptr)
#endif
GameplayTagTreeChangedEvent.Broadcast();
}
// Update the TagRedirects map
TagRedirects.Empty();
FConfigSection* PackageRedirects = GConfig->GetSectionPrivate(TEXT("/Script/Engine.Engine"), false, true, GEngineIni);
for (FConfigSection::TIterator It(*PackageRedirects); It; ++It)
{
if (It.Key() == TEXT("GameplayTagRedirects"))
{
FName OldTagName = NAME_None;
FName NewTagName;
if (FParse::Value(*It.Value(), TEXT("OldTagName="), OldTagName))
{
if (FParse::Value(*It.Value(), TEXT("NewTagName="), NewTagName))
{
if (ensureMsgf(!TagRedirects.Contains(OldTagName), TEXT("Old tag %s is being redirected to more than one tag. Please remove all the redirections except for one."), *OldTagName.ToString()))
{
FGameplayTag OldTag = RequestGameplayTag(OldTagName, false); //< This only succeeds if OldTag is in the Table!
if (OldTag.IsValid())
{
UE_LOG(LogGameplayTags, Warning,
TEXT("Old tag (%s) which is being redirected still exists in the table! Generally you should "
//.........这里部分代码省略.........