thenull3 (thenull3) January 21, 2025, 4:19pm 1 How can I add “virtual assets” to content browser?
For example, I have a file in content browser with extension .css, how do I tell the content browser about it? How to display the icon and the name of asset in Editor WITHOUT creating respective .uasset file (this is important).
I know that Content Browser supports uassets and umaps. And I know that assets are shown when they are deserialized and the engine extracts all the information.
I need a solution without compiling the entire engine.
thenull3 (thenull3) January 21, 2025, 7:23pm 2 I wrote something, assets appear, but are not deleted if I delete .css files.
FDelegateHandle FCustomAssetManager::WatcherHandle = FDelegateHandle(); void FCustomAssetManager::Initialize() { WatchDirectory = FPaths::ProjectContentDir(); FDirectoryWatcherModule& DirectoryWatcher = FModuleManager::LoadModuleChecked<FDirectoryWatcherModule>("DirectoryWatcher"); DirectoryWatcher.Get()->RegisterDirectoryChangedCallback_Handle( WatchDirectory, IDirectoryWatcher::FDirectoryChanged::CreateRaw(this, &FCustomAssetManager::ScanForCSSFiles), FCustomAssetManager::WatcherHandle, IDirectoryWatcher::WatchOptions::IncludeDirectoryChanges ); } void FCustomAssetManager::Shutdown() { if (FModuleManager::Get().IsModuleLoaded("DirectoryWatcher")) { FDirectoryWatcherModule& DirectoryWatcher = FModuleManager::LoadModuleChecked<FDirectoryWatcherModule>("DirectoryWatcher"); DirectoryWatcher.Get()->UnregisterDirectoryChangedCallback_Handle(WatchDirectory, OnDirectoryChangedHandle); } } void FCustomAssetManager::ScanForCSSFiles(const TArray<FFileChangeData> & Data) { if (Data.Num() == 0) return; for (FFileChangeData File : Data) { if (FPaths::GetExtension(File.Filename) != "css") continue; FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser"); IContentBrowserSingleton& ContentBrowserSingleton = ContentBrowserModule.Get(); IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry").Get(); FAssetData VirtualAsset( FName(FPaths::GetBaseFilename(File.Filename)), FName("/Game"), FName(FPaths::GetBaseFilename(File.Filename)), FName("CSS") ); FAssetRegistryState AssetRegistryState = FAssetRegistryState(); if (File.Action == FFileChangeData::FCA_Removed) { bool bDummy; AssetRegistryState.RemoveAssetData(&VirtualAsset, false, bDummy, bDummy); AssetRegistry.AppendState(AssetRegistryState); } else if (File.Action == FFileChangeData::FCA_Added) { AssetRegistryState.AddAssetData(&VirtualAsset); AssetRegistry.AppendState(AssetRegistryState); } } }
1 Like