Adding Blueprint Static Analysis Tool#
The easiest way to augment the compiler would be to write a UBlueprintCompilerExtension
, just derive from that type and when you want to enable your extension (e.g. only when a commandlet is running, ini setting is set, or unconditionally at CDO creation time) just call FBlueprintCompilationManager::RegisterCompilerExtension. The first parameter is the type of blueprints you're interested in - e.g. UBlueprint::StaticClass() if you want to instrument all blueprint compilation.
Reference https://udn.unrealengine.com/questions/513017/blueprint-static-analysis.html
Adding Mapcheck for Blueprints#
Check KismetEditorUtilities.h/BlueprintEditorUtils.h/BlueprintEditorUtils.cpp/ComponentEditorUtils.h
GetSimpleConstructionScript(USceneComponent const* Component);
FindCorrespondingSCSNode(USceneComponent const* ComponentObj);
virtual void EditorReplacedActor(AActor* OldActor) {}
Useful editor tool class:
FBlueprintEditorUtils
===========================================
void UBlueprint::GetAllGraphs(TArray<UEdGraph\*>> Graphs) const
/\*\* Set of pages that combine into a single uber-graph \*/
UPROPERTY()
TArray<class UEdGraph\*> UbergraphPages;
/\*\* Set of functions implemented for this class graphically \*/
UPROPERTY()
TArray<class UEdGraph\*> FunctionGraphs;
/\*\* Graphs of signatures for delegates \*/
UPROPERTY()
TArray<class UEdGraph\*> DelegateSignatureGraphs;
/\*\* Set of macros implemented for this class \*/
UPROPERTY()
TArray<class UEdGraph\*> MacroGraphs;
for (UEdGraph\* CurrentGraph : Blueprint->FunctionGraphs)
{
if( CurrentGraph->GetFName() == Schema->FN_UserConstructionScript )
{
return CurrentGraph;
}
}
=========
Find references function/find function
GetFindReferenceSearchString
FindInBlueprints.h:
SFindInBlueprints::MakeSearchQuery() - to comprehensively search blueprint nodes (e.g. parameters, comments, etc)
TSharedPtr< FImaginaryBlueprint> ImaginaryBlueprint(new FImaginaryBlueprint(Blueprint->GetName(), Blueprint->GetPathName(), ParentClass, Interfaces, FFindInBlueprintSearchManager::Get().QuerySingleBlueprint(Blueprint)));
TSharedPtr< FFiBSearchInstance > SearchInstance(new FFiBSearchInstance);
FSearchResult SearchResult = RootSearchResult = SearchInstance->StartSearchQuery(SearchValue, ImaginaryBlueprint);
========
//Show what objects points to this, using the assetregistry
ObjectTools::ShowReferencers()
RetrieveReferencers( TArray<FReferencerInformation>\* OutInternalReferencers, TArray<FReferencerInformation>\* OutExternalReferencers);
//Show objects this points to
ObjectTools::ShowReferencedObjs(GetBlueprintObj());
//To differentiate between what the default class points to vs. the instance
ObjectTools::ShowReferencedObjs(GetBlueprintObj()->GeneratedClass);
/\*\* Gather all bps that Blueprint depends on \*/
static void GatherDependencies(const UBlueprint\* Blueprint, TSet<TWeakObjectPtr<UBlueprint>>& OutDependencies, TSet<TWeakObjectPtr<UStruct>>& OutUDSDependencies);
/\*\* Returns a list of loaded Blueprints that are dependent on the given Blueprint. \*/
static void GetDependentBlueprints(UBlueprint\* Blueprint, TArray<UBlueprint\*>& DependentBlueprints, bool bRemoveSelf = true);
=========
Search Asset Registry
FAssetRegistryModule\* AssetRegistryModule = &FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
TArray<FAssetData> AssetData;
FARFilter Filter;
Filter.ClassNames.Add( UBlueprint::StaticClass()->GetFName() ); //get blueprints
Filter.PackagePaths.Add("/Game/Blueprints/RoomModel"); //from location
AssetRegistryModule->Get().GetAssets(Filter, AssetData);
//AssetRegistryModule->Get().GetAssetsByClass(Class->GetFName(), AssetData);
for (TArray<FAssetData>::TConstIterator PkgIter = AssetData.CreateConstIterator(); PkgIter; ++PkgIter)
{
FAssetData Asset = \*PkgIter;
UBlueprint\* BlueAsset = Cast<UBlueprint>(Asset.GetAsset());
if (BlueAsset->ParentClass == ARoomConnection::StaticClass()){
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, Asset.AssetName.GetPlainNameString());
}
}
================================
Check if Actor is a Blueprint
UBlueprint::GetBlueprintFromClass(const UClass\* InClass);
BlueprintClass->HasAnyClassFlags(CLASS_CompiledFromBlueprint)
UObject->IsA(UBlueprintGeneratedClass::StaticClass())
UClass->IsChildOf(UBlueprintGeneratedClass::StaticClass())
Find all nodes of type
TArray<UK2Node_CustomEvent\*> BpCustomEvents;
FBlueprintEditorUtils::GetAllNodesOfClass<UK2Node_CustomEvent>(FuncBlueprint, BpCustomEvents);
static bool GetBlueprintHierarchyFromClass(const UClass\* InClass, TArray<UBlueprint\*>& OutBlueprintParents);
===============
For finding shit that exists in bad folders:
TFindObjectReferencers
ShowReferencedObjs
UObject::OutputReferencers()/RetrieveReferencers()