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"));
|
|||
|
|
}
|