我正在尝试使用 CUE4Parse 从未加密的 UE4 PAK 文件中读取本地化文件(.locres 和 .locmeta)。但是当我尝试调用 LoadObject 或 LoadObjectAll 来读取文件时,我收到错误消息,提示找不到 .uasset
查看 LoadLocalization 中的代码展示了如何通过从“文件”创建存档读取器,然后从读取器实例化相关对象来解决此问题。我使用以下代码提取与目录模式匹配的所有 LOC 文件。
var cacheDir = Environment.GetEnvironmentVariable("TMP");
cacheDir = cacheDir.Replace("\\", "/");
Log.Logger = new LoggerConfiguration().WriteTo.Console(theme: AnsiConsoleTheme.Literate).CreateLogger();
var gameDir = {Directory where PAK files Live};
var provider = new DefaultFileProvider(gameDir, SearchOption.AllDirectories, false, new VersionContainer(EGame.GAME_UE4_27));
// Scan local files and read them to know what it has to deal with (PAK/UTOC/UCAS/UASSET/UMAP)
provider.Initialize();
// Decrypt basic info (1 guid - 1 key)
provider.SubmitKey(new FGuid(), new FAesKey(AES key for game or all 0s if not encrypted));
provider.LoadLocalization(ELanguage.English);
foreach(var key in provider.Files.Keys)
{
if(key.Contains({partial path for LOC files}))
{
var outPath = cacheDir+$"/LOC/{game}" + key[(key.IndexOf(_locFilesDir)+_locFilesDir.Length-1)..(key.LastIndexOf('/')+1)];
new FileInfo(outPath).Directory.Create();
var file = provider.Files[key];
file.TryCreateReader(out var archive);
if(key.EndsWith(".locres"))
{
var locres = new FTextLocalizationResource(archive);
var locJson = JsonConvert.SerializeObject(locres, Formatting.Indented);
File.WriteAllText(outPath + "Game.json", locJson);
}
else if(key.EndsWith(".locmeta"))
{
var locmeta = new FTextLocalizationMetaDataResource(archive);
var locJson = JsonConvert.SerializeObject(locmeta, Formatting.Indented);
File.WriteAllText(outPath + "Game.json", locJson);
}
}
}