UE的资源操作监听和修改

资源注册表

先说明一下,很多知识都可以在上面的link里学习到的!

背景交代

项目的资源我们是希望有一套规范的!比如:

  • 资源在导入的时候检查纹理的大小是否在规范的范围内
  • fbx导入的时候自动设置部分属性和检查骨骼数量
  • 资源名称是否符合标准
  • 资源的路径是否正确
  • ……

因为很多都是有规范的,所以我们需要有一些自动的工具去处理!

方案列举

目前大致想了一下,基本有一下几个方案:

  • 工程内(本地或者分布)
    • 每次打开项目都检查所有的资源
      • 使用plugin加载的时候放置资源监听
    • 只有项目工程打开后,有变动才检查变动的资源
      • 使用pluginOnFilesLoaded加载完成后放置资源监听
      • 使用startuppython启动资源监听
  • ci(远程)
    • 使用buildgraph检查,但是只能通过push后才能执行操作,目前只能发邮件,有些修改还是不建议自动化修改!

png

https://docs.unrealengine.com/4.27/zh-CN/ProductionPipelines/ScriptingAndAutomation/Python/

目前我就挑了使用plugin,OnFilesLoaded加载完成后放置资源监听去实现的。以下是具体操作和代码!

详细过程

创建一个EditorPlugin,name=UEEditorTools

FUEEditorToolsModule::StartupModule()

    const FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
	auto& AssetRegistry  = AssetRegistryModule.Get();
	AddAssetEvents.Emplace(AssetRegistry.OnAssetAdded().AddRaw(Singleton<CustomAssetTool>::GetInstance(), &CustomAssetTool::OnAssetAdded));

FUEEditorToolsModule::ShutdownModule()

	if (!FModuleManager::Get().IsModuleLoaded("AssetRegistry"))
	{
		return ;
	}
    const FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
	auto& AssetRegistry  = AssetRegistryModule.Get();
	// OnAssetAdded
	for (const auto AddDelegateHandle : AddAssetEvents)
	{
		AssetRegistry.OnAssetAdded().Remove(AddDelegateHandle);
	}
	AddAssetEvents.Empty();

更多的api

/** 注册/取消注册适用于资源被添加到注册表中的情况的回调*/
virtual FAssetAddedEvent& OnAssetAdded() = 0;

/** 注册/取消注册适用于资源被从注册表中删除的情况的回调*/
virtual FAssetRemovedEvent& OnAssetRemoved() = 0;

/** 注册/取消注册适用于资源在注册表中被重命名的情况的回调*/
virtual FAssetRenamedEvent& OnAssetRenamed() = 0;

/** 注册/取消注册适用于资源注册表加载完文件的情况的回调*/
virtual FFilesLoadedEvent& OnFilesLoaded() = 0;

/** 注册/取消注册更新后台文件加载进度的回调*/
virtual FFileLoadProgressUpdatedEvent& OnFileLoadProgressUpdated() = 0;

/** 如果资源注册表当前正在加载文件,尚无法返回有关所有资源的信息时返回True*/
virtual bool IsLoadingAssets() = 0;

如果是需要等待ue工程启动完成后才对资源进行操作的,可以监听OnFilesLoaded的回调!

资源的设置修改

这里就简单使用UTexture为例吧!

	void CustomAssetTool::OnAssetAdded(const FAssetData& AssetData)
	{
		// 如果ue还没有启动,就不要使用
		if (!IsFirstLoad)
			return;
		UE_LOG(UEEditorModuelLog, Display, TEXT("CustomAssetTool::OnAssetAdded name:%s path:%s"),
			*(AssetData.AssetName.ToString()), *(AssetData.ObjectPath.ToString()));
		// 获取资源
		auto obj = AssetData.GetAsset();
		// 转换成具体的资源!
		auto texture = Cast<UTexture>(obj);
		UE_LOG(UEEditorModuelLog, Display, TEXT("CustomAssetTool::OnAssetAdded GetSizeX:%d"),
			texture->Source.GetSizeX());
		// 修改纹理是否使用gamma
		texture->bUseLegacyGamma = true;
	}

修改完成后,因为是plugin,要么重启ue工程,要么就是reimport module才能生效!

png

FAssetData的一些说明,可以参考下面的link

https://blog.csdn.net/kuangben2000/article/details/107010490