195 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			195 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | // Fill out your copyright notice in the Description page of Project Settings.
 | |||
|  | 
 | |||
|  | 
 | |||
|  | #include "DefaultGenerators/CSAssetManagerGlueGenerator.h"
 | |||
|  | 
 | |||
|  | #include "Engine/AssetManager.h"
 | |||
|  | #include "Engine/AssetManagerSettings.h"
 | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::Initialize() | |||
|  | { | |||
|  | 	if (UAssetManager::IsInitialized()) | |||
|  | 	{ | |||
|  | 		TryRegisterAssetTypes(); | |||
|  | 	} | |||
|  | 	else | |||
|  | 	{ | |||
|  | 		FModuleManager::Get().OnModulesChanged().AddUObject(this, &UCSAssetManagerGlueGenerator::OnModulesChanged); | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::TryRegisterAssetTypes() | |||
|  | { | |||
|  | 	if (bHasRegisteredAssetTypes || !UAssetManager::IsInitialized()) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	UAssetManager::Get().CallOrRegister_OnCompletedInitialScan( | |||
|  | 		FSimpleMulticastDelegate::FDelegate::CreateUObject(this, &ThisClass::OnCompletedInitialScan)); | |||
|  | 	bHasRegisteredAssetTypes = true; | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnModulesChanged(FName InModuleName, EModuleChangeReason InModuleChangeReason) | |||
|  | { | |||
|  | 	if (InModuleChangeReason != EModuleChangeReason::ModuleLoaded) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	TryRegisterAssetTypes(); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnCompletedInitialScan() | |||
|  | { | |||
|  | 	IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry").Get(); | |||
|  | 	AssetRegistry.OnAssetRemoved().AddUObject(this, &ThisClass::OnAssetRemoved); | |||
|  | 	AssetRegistry.OnAssetRenamed().AddUObject(this, &ThisClass::OnAssetRenamed); | |||
|  | 	AssetRegistry.OnInMemoryAssetCreated().AddUObject(this, &ThisClass::OnInMemoryAssetCreated); | |||
|  | 	AssetRegistry.OnInMemoryAssetDeleted().AddUObject(this, &ThisClass::OnInMemoryAssetDeleted); | |||
|  | 
 | |||
|  | 	UAssetManager::Get().Register_OnAddedAssetSearchRoot( | |||
|  | 		FOnAddedAssetSearchRoot::FDelegate::CreateUObject(this, &ThisClass::OnAssetSearchRootAdded)); | |||
|  | 
 | |||
|  | 	UAssetManagerSettings* Settings = UAssetManagerSettings::StaticClass()->GetDefaultObject<UAssetManagerSettings>(); | |||
|  | 	Settings->OnSettingChanged().AddUObject(this, &ThisClass::OnAssetManagerSettingsChanged); | |||
|  | 
 | |||
|  | 	ProcessAssetIds(); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnAssetRemoved(const FAssetData& AssetData) | |||
|  | { | |||
|  | 	if (!IsRegisteredAssetType(AssetData)) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 	WaitUpdateAssetTypes(); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnAssetRenamed(const FAssetData& AssetData, const FString& OldObjectPath) | |||
|  | { | |||
|  | 	OnAssetRemoved(AssetData); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnInMemoryAssetCreated(UObject* Object) | |||
|  | { | |||
|  | 	if (!IsRegisteredAssetType(Object)) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 	WaitUpdateAssetTypes(); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnInMemoryAssetDeleted(UObject* Object) | |||
|  | { | |||
|  | 	OnInMemoryAssetCreated(Object); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnAssetSearchRootAdded(const FString& RootPath) | |||
|  | { | |||
|  | 	WaitUpdateAssetTypes(); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::OnAssetManagerSettingsChanged(UObject* Object, | |||
|  | 	FPropertyChangedEvent& PropertyChangedEvent) | |||
|  | { | |||
|  | 	WaitUpdateAssetTypes(); | |||
|  | 	GEditor->GetTimerManager()->SetTimerForNextTick( | |||
|  | 		FTimerDelegate::CreateUObject(this, &ThisClass::ProcessAssetTypes)); | |||
|  | } | |||
|  | 
 | |||
|  | bool UCSAssetManagerGlueGenerator::IsRegisteredAssetType(UClass* Class) | |||
|  | { | |||
|  | 	if (!IsValid(Class)) | |||
|  | 	{ | |||
|  | 		return false; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	UAssetManager& AssetManager = UAssetManager::Get(); | |||
|  | 	const UAssetManagerSettings& Settings = AssetManager.GetSettings(); | |||
|  | 
 | |||
|  | 	bool bIsPrimaryAsset = false; | |||
|  | 	for (const FPrimaryAssetTypeInfo& PrimaryAssetType : Settings.PrimaryAssetTypesToScan) | |||
|  | 	{ | |||
|  | 		if (Class->IsChildOf(PrimaryAssetType.GetAssetBaseClass().Get())) | |||
|  | 		{ | |||
|  | 			bIsPrimaryAsset = true; | |||
|  | 			break; | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return bIsPrimaryAsset; | |||
|  | } | |||
|  | 
 | |||
|  | FString ReplaceSpecialCharacters(const FString& Input) | |||
|  | { | |||
|  | 	FString ModifiedString = Input; | |||
|  | 	FRegexPattern Pattern(TEXT("[^a-zA-Z0-9_]")); | |||
|  | 	FRegexMatcher Matcher(Pattern, ModifiedString); | |||
|  | 
 | |||
|  | 	while (Matcher.FindNext()) | |||
|  | 	{ | |||
|  | 		int32 MatchStart = Matcher.GetMatchBeginning(); | |||
|  | 		int32 MatchEnd = Matcher.GetMatchEnding(); | |||
|  | 		ModifiedString = ModifiedString.Mid(0, MatchStart) + TEXT("_") + ModifiedString.Mid(MatchEnd); | |||
|  | 		Matcher = FRegexMatcher(Pattern, ModifiedString); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return ModifiedString; | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::ProcessAssetIds() | |||
|  | { | |||
|  | 	UAssetManager& AssetManager = UAssetManager::Get(); | |||
|  | 	const UAssetManagerSettings& Settings = AssetManager.GetSettings(); | |||
|  | 
 | |||
|  | 	FCSScriptBuilder ScriptBuilder(FCSScriptBuilder::IndentType::Tabs); | |||
|  | 	ScriptBuilder.AppendLine(); | |||
|  | 	ScriptBuilder.AppendLine(TEXT("using UnrealSharp.CoreUObject;")); | |||
|  | 	ScriptBuilder.AppendLine(); | |||
|  | 	ScriptBuilder.AppendLine(TEXT("public static class AssetIds")); | |||
|  | 	ScriptBuilder.OpenBrace(); | |||
|  | 
 | |||
|  | 	for (const FPrimaryAssetTypeInfo& PrimaryAssetType : Settings.PrimaryAssetTypesToScan) | |||
|  | 	{ | |||
|  | 		TArray<FPrimaryAssetId> PrimaryAssetIdList; | |||
|  | 		AssetManager.GetPrimaryAssetIdList(PrimaryAssetType.PrimaryAssetType, PrimaryAssetIdList); | |||
|  | 		for (const FPrimaryAssetId& AssetType : PrimaryAssetIdList) | |||
|  | 		{ | |||
|  | 			FString AssetName = PrimaryAssetType.PrimaryAssetType.ToString() + TEXT(".") + AssetType.PrimaryAssetName. | |||
|  | 				ToString(); | |||
|  | 			AssetName = ReplaceSpecialCharacters(AssetName); | |||
|  | 
 | |||
|  | 			ScriptBuilder.AppendLine(FString::Printf( | |||
|  | 				TEXT("public static readonly FPrimaryAssetId %s = new(\"%s\", \"%s\");"), | |||
|  | 				*AssetName, *AssetType.PrimaryAssetType.GetName().ToString(), *AssetType.PrimaryAssetName.ToString())); | |||
|  | 		} | |||
|  | 	} | |||
|  | 
 | |||
|  | 	ScriptBuilder.CloseBrace(); | |||
|  | 	SaveRuntimeGlue(ScriptBuilder, TEXT("AssetIds")); | |||
|  | } | |||
|  | 
 | |||
|  | void UCSAssetManagerGlueGenerator::ProcessAssetTypes() | |||
|  | { | |||
|  | 	UAssetManager& AssetManager = UAssetManager::Get(); | |||
|  | 	const UAssetManagerSettings& Settings = AssetManager.GetSettings(); | |||
|  | 
 | |||
|  | 	FCSScriptBuilder ScriptBuilder(FCSScriptBuilder::IndentType::Tabs); | |||
|  | 	ScriptBuilder.AppendLine(); | |||
|  | 	ScriptBuilder.AppendLine(TEXT("using UnrealSharp.CoreUObject;")); | |||
|  | 	ScriptBuilder.AppendLine(); | |||
|  | 	ScriptBuilder.AppendLine(TEXT("public static class AssetTypes")); | |||
|  | 	ScriptBuilder.OpenBrace(); | |||
|  | 
 | |||
|  | 	for (const FPrimaryAssetTypeInfo& PrimaryAssetType : Settings.PrimaryAssetTypesToScan) | |||
|  | 	{ | |||
|  | 		FString AssetTypeName = ReplaceSpecialCharacters(PrimaryAssetType.PrimaryAssetType.ToString()); | |||
|  | 
 | |||
|  | 		ScriptBuilder.AppendLine(FString::Printf(TEXT("public static readonly FPrimaryAssetType %s = new(\"%s\");"), | |||
|  | 		                                         *AssetTypeName, *PrimaryAssetType.PrimaryAssetType.ToString())); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	ScriptBuilder.CloseBrace(); | |||
|  | 	SaveRuntimeGlue(ScriptBuilder, TEXT("AssetTypes")); | |||
|  | } |