先说明一下,很多知识都可以在上面的link里学习到的!
背景交代
项目的资源我们是希望有一套规范的!比如:
- 资源在导入的时候检查纹理的大小是否在规范的范围内
- fbx导入的时候自动设置部分属性和检查骨骼数量
- 资源名称是否符合标准
- 资源的路径是否正确
- ……
因为很多都是有规范的,所以我们需要有一些自动的工具去处理!
方案列举
目前大致想了一下,基本有一下几个方案:
- 工程内(本地或者分布)
- 每次打开项目都检查所有的资源
- 使用
plugin
加载的时候放置资源监听
- 使用
- 只有项目工程打开后,有变动才检查变动的资源
- 使用
plugin
,OnFilesLoaded
加载完成后放置资源监听 - 使用
startup
的python
启动资源监听
- 使用
- 每次打开项目都检查所有的资源
- ci(远程)
- 使用
buildgraph
检查,但是只能通过push
后才能执行操作,目前只能发邮件,有些修改还是不建议自动化修改!
- 使用
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
才能生效!
FAssetData
的一些说明,可以参考下面的link
https://blog.csdn.net/kuangben2000/article/details/107010490
PREVIOUSLua的编译和反编译
NEXT半透明物体的描边和投影