UE4.27.2 转换虚拟资产路径到实际资产路径
2025-05-20 22:58:09

通过 FAssetData.PackageName 可以知道资产不带扩展名的虚拟路径

有的时候想要知道它对应磁盘上的实际资产绝对路径

Engine/Source/Runtime/CoreUObject/Private/Misc/PackageName.cpp 的 FLongPackagePathsSingleton 存储了虚拟路径根目录到实际路径根目录绝对路径的转化

这个映射关系存成 pair,需要转化的时候,遍历这个 pair 来对比,找到了就替换,然后返回替换后的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool FPackageName::TryConvertLongPackageNameToFilename(const FString& InLongPackageName, FString& OutFilename, const FString& InExtension)
{
const auto& Paths = FLongPackagePathsSingleton::Get();
FReadScopeLock ScopeLock(ContentMountPointCriticalSection);
for (const auto& Pair : Paths.ContentRootToPath)
{
if (InLongPackageName.StartsWith(Pair.RootPath))
{
OutFilename = Pair.ContentPath + InLongPackageName.Mid(Pair.RootPath.Len()) + InExtension;
return true;
}
}

// This is not a long package name or the root folder is not handled in the above cases
return false;
}

最终这个方法被封装成 FPackageName::LongPackageNameToFilename

至于后缀所有的可能,已经在 Engine/Source/Runtime/CoreUObject/Private/Misc/PackageName.cpp 给出

1
2
3
4
FString FPackageName::AssetPackageExtension = TEXT(".uasset");
FString FPackageName::MapPackageExtension = TEXT(".umap");
FString FPackageName::TextAssetPackageExtension = TEXT(".utxt");
FString FPackageName::TextMapPackageExtension = TEXT(".utxtmap");

FPackageName 对它们有一层 getter 的封装

知道了这些,给定任意一个资产,就可以知道它不带后缀的路径

给定任意一个资产,怎么知道他对应的后缀是什么呢?

感觉这就需要客户端自己安排了