Reimport With New File 入口
FAssetFileContextMenu::ExecuteReimportWithNewFile
收集所有重新导入的资产,传给 FReimportManager::ValidateAllSourceFileAndReimport
FReimportManager::ValidateAllSourceFileAndReimport
处理那些丢失的资产对象 missing file,然后把剩下的那些资产对象传给 FReimportManager::ReimportMultiple
FReimportManager::ReimportMultiple
遍历资产对象,对每一个资产对象调用 FReimportManager::Reimport
进行重新导入
FReimportManager::Reimport
对这一个资产对象的所有源文件检查是否丢失等,然后寻找合适的 FReimportHandler
,最终调用 FReimportHandler::Reimport
来重新导入
这是一个虚函数,以实现导入行为的多态
对于重新加载纹理,进入的是 UReimportTextureFactory::Reimport
最终到 UTextureFactory::FactoryCreateBinary
,堆栈如下,就不分析了
1 | UTextureFactory::FactoryCreateBinary(UClass *, UObject *, FName, EObjectFlags, UObject *, const wchar_t *, const unsigned char *&, const unsigned char *, FFeedbackContext *) EditorFactories.cpp:4337 |
UTextureFactory::FactoryCreateBinary
删掉了类型检查、事件、UDIM、保存图片导入设置、guid、法线贴图、LOD 组、恢复图片导入设置、纹理数组、自动创建纹理等内容,精简为
1 | UObject* UTextureFactory::FactoryCreateBinary |
前面是确保被替换的纹理已经初始化了 RHI 资源
然后就是替换的核心逻辑了 RefReplacer.Replace(Texture);
1 | /** |
搜索了整个引擎,只有 Editor 的这个 reimport 的功能使用了 FTextureReferenceReplacer
这个结构体