- Fmodel查看
- UE5Zen尝试
- UE5Zen的漏洞
- UAssetGUI使用
- 存在locres文件不使用IoStore
- PS scan timed out - StaticConstructObject_Internal not found on UE 5.6.1.0
UE的Slate模块
先写一个bat工具方便查看pak文件:
@REM 支持参数(4.26)
@REM UnrealPak <PakFilename> -Test 测试Pak文件能否打开(是否加密)
@REM UnrealPak <PakFilename> -Verify UnrealPak <PakFilename> -Info
@REM UnrealPak <PakFilename> -List [-ExcludeDeleted] 查看
@REM UnrealPak <PakFilename> <GameUProjectName> <GameFolderName> -ExportDependencies=<OutputFileBase> -NoAssetRegistryCache -ForceDependsGathering
@REM UnrealPak <PakFilename> -Extract <ExtractDir> [-Filter=<filename>] 解包
@REM UnrealPak <PakFilename> -Create=<ResponseFile> [Options] 打包
@REM UnrealPak <PakFilename> -Dest=<MountPoint> 更改MountPoint
@REM UnrealPak <PakFilename> -Repack [-Output=Path] [-ExcludeDeleted] [Options]
@REM UnrealPak <PakFilename1> <PakFilename2> -diff 对比两个 pak
@REM UnrealPak <PakFolder> -AuditFiles [-OnlyDeleted] [-CSV=<filename>] [-order=<OrderingFile>] [-SortByOrdering]
@REM UnrealPak <PakFilename> -WhatsAtOffset [offset1] [offset2] [offset3] [...]
@REM UnrealPak <PakFolder> -GeneratePIXMappingFile -OutputPath=<Path>
@REM Options:
@REM -blocksize=<BlockSize> 块大小
@REM -bitwindow=<BitWindow>
@REM -compress 压缩
@REM -order=<OrderingFile> Cooker烘焙时的顺序文件
@REM -diff (requires 2 filenames first) 比较 pak
@REM -enginedir (specify engine dir for when using ini encryption configs) 引擎目录
@REM -projectdir (specify project dir for when using ini encryption configs) 项目目录
@REM -encrypt 加密
@REM -encryptindex (encrypt the pak file index, making it unusable in unrealpak without supplying the key) 加密索引,不提供key无法解密。可以在Project Setting -> Packaging - > Encrypt the pak index....配置
@REM -encryptionini (specify ini base name to gather encryption settings from) 单独加密ini文件,可以在Project Setting -> Packaging - > Encrypt ini files inside pak files配置
@REM -encryptionkeyoverrideguid (override the encryption key guid used for encrypting data in this pak file)
@REM -sign (generate a signature (.sig) file alongside the pak) RSA签名:0x<私钥指数>+0x<私钥系数>+0x<公钥指数> 或者指定<KeyFileName>
@REM -aes 32位密钥
@REM -extracttomountpoint (Extract to mount point path of pak file)
@REM -compressionformat[s]=<Format[,format2,...]> (set the format(s) to compress with, falling back on failures)
@REM -fallbackOrderForNonUassetFiles (if order is not specified for ubulk/uexp files, figure out implicit order based on the uasset order. Generally applies only to the cooker order) -moveBulkAndUptnlOrderLast (move all ubulk and uptnl files after all other resources in the first Order list. Ubulk and uptnl files will be at the end, and will preserve their order)
@REM 补充:
@REM -abslog 指定打包日志文件路径
@REM -UTF8Output UTF8输出
@REM -tempfiles= 烘焙文件临时存储
@REM -multiprocess 多线程
@REM -patchpaddingalign= 数据块对齐
@REM -generatepatch= 打Patch包时会添加的参数,后面指定要比较的Release文件
@REM -cryptokeys=<Crypto.json> 指定 Crypto.json
@REM set UnrealPak = F:/UE_5.4/Engine/Binaries/Win64/UnrealPak.exe
@REM UnrealPak "F:\UEProjects\ALearnTest\ModTest\Build\Windows\ModTest\Content\Paks\ModTest-Windows.pak" -list
@ECHO OFF ECHO ------------------------------------------------------------------
ECHO UnrealPak Strart Create Pak
ECHO ------------------------------------------------------------------
set PakFilename="F:\UEProjects\ALearnTest\ModTest\Build\Windows\ModTest\Content\Paks\ModTest-Windows.pak"
set ResponseFile="F:\UEProjects\ALearnTest\ModTest\Build\Windows\ModTest\Content\Paks\PakList.txt"
set UnrealPak="F:\UE_5.4\Engine\Binaries\Win64\UnrealPak.exe"
@REM CALL %UnrealPak% %PakFilename% -create=%ResponseFile%
CALL %UnrealPak% %PakFilename% -List
@REM PAUSE
cmd
参考:
Fmodel查看
测试项目是我使用第三人称模版使用Shipping打包的,只不过我在里面添加一个UI,上面有一句英文用来测试汉化成不成功。
使用Fmodel打开后双击一个.uasset文件发现,下方出现报错信息:Package has unversioned properties but mapping file (.usmap) is missing
使用UE4SS获取usmap
下载UE4SS的开发版本,并放在\ModTest\Build\Windows\Engine\Binaries\Win64里,然后双击\ModTest\Build\Windows\ModTest.exe就应该能看见UE4SS的GUI了,点击Dumpers后下方选择Generate .usmap file ...

文件将输出到:\ModTest\Build\Windows\Engine\Binaries\Win64\FILENAME.usmap
然后将这个文件在Fmodel中设置

查看本地化文件
如果游戏制作者对游戏进行了本地化,那么你在目录中会看到
如果没有进行本地化,只能去找有没有专门存储文本的文件,如果这个也没有只能挨个查看,一般先看UI的LocalizedString字段
Fmodel是没有办法直接修改的,需要借助其他工具
UE5Zen尝试
我最开始找到的是UE5Zen的办法
config配置如下:
{
"ToolRootDir": "C:/Users/lbd/Desktop/TranslationScripts-main/TranslationScripts-main/GameEngineTool/UE5Zen/ZenLocalizationWorkflow",
"RetocCliPath": "C:/Users/lbd/Desktop/TranslationScripts-main/TranslationScripts-main/GameEngineTool/UE5Zen/retoc_cli/retoc.exe",
"UsmapPath": "C:/Users/lbd/Desktop/zDEV-UE4SS_v3.0.1-1018-g662df915/ue4ss/ModTest-5.4.4-35576357+++UE5+Release-5.4-662df915.usmap",
"GamePaksDir": "F:/UEProjects/ALearnTest/ModTest/Build/Windows/ModTest/Content/Paks",
"WorkspaceDir": "C:/Users/lbd/Desktop/TranslationScripts-main/TranslationScripts-main/GameEngineTool/UE5Zen/Test/workspace",
"ManualTransFilePath": "C:/Users/lbd/Desktop/TranslationScripts-main/TranslationScripts-main/GameEngineTool/UE5Zen/Test/workspace/ManualTransFile.json",
"RetocVersion": "UE5_4",
"AesKey": null
}
目录结构如下

这个是一整个流程,不过他的拆包合包都是需要IoStore的(使用retoc_cli进行,我不太会用,可能单pak也可以吧),而我的ModTest工程打包时取消勾选了此项,因此我稍微删除了一些流程:将run_prepare中的unpacked流程删除(# reset_directory(config.unpacked_uasset_dir)),这样他只会从workspace中读取我从Fmodel中导出的文件(.uasset, .uexp我都放在了1_UnpackedUAsset文件夹中),生成可以使用的json(Fmodel导出的json是只读的没办法修改)和ManualTransFile.json,我只需要运行py -3 ZenLocalizationWorkflow\run_pipeline.py prepare Test\config.json指令后,在workspace中翻译ManualTransFile.json里的值
{
"This is my Text Block": "这是文本"
}
之后再运行py -3 ZenLocalizationWorkflow\run_pipeline.py build Test\config.json,他就会生成修改后的json文件,并将之repack到.uasset和.uexp文件,之前我说过他的拆包合包不适配,因此将repack后的文件直接使用UnrealPak打包(参考教程,使用他的bat文件加了修改),bat文件如下:
F:\UE_5.4\Engine\Binaries\Win64\UnrealPak.exe "%~1.pak" -Create=C:\Users\lbd\Desktop\UnrealPak\filelist.txt -compress
filelist.txt
"C:\Users\lbd\Desktop\UnrealPak\MyMod_P\*.*" "../../../ModTest/Content/UI/"
将带有repack后的文件的文件夹拖入到bat文件上就会生成一个该文件夹名字的pak文件,将此pak文件拖入到游戏的Content/Paks目录下就可以了,至此UE5Zen流程结束。
补充
FileList自动化
像上述那么写的话,所有的文件挂载路径都是UI/了,不适配其他项目,而一个一个写太麻烦,所以写了一个CreatePakFile.bat:
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: bat所在目录
set "BAT_DIR=%~dp0"
:: 待扫描的源文件夹(bat目录下的ModTest)
set "SOURCE_DIR=%BAT_DIR%ModTest"
:: 输出列表文件,放在bat同级
set "OUT_TXT=%BAT_DIR%FileList.txt"
:: 清空旧文件
echo. > "%OUT_TXT%"
echo Scanning: %SOURCE_DIR%
echo Output: %OUT_TXT%
:: 遍历ModTest下所有文件
for /r "%SOURCE_DIR%" %%f in (*) do (
set "FULL_LOCAL=%%f"
:: 获取相对于 ModTest 的路径
set "REL_PATH=!FULL_LOCAL:%SOURCE_DIR%\=!"
:: 拼接pak内虚拟路径 ../../../ModTest/xxx
set "PAK_VIRT=../../../ModTest/!REL_PATH:\=/!"
:: 写入一行 "本地完整路径" "pak虚拟路径"
echo "!FULL_LOCAL!" "!PAK_VIRT!" >> "%OUT_TXT%"
)
echo Done! FileList.txt generated.
pause
endlocal
使用方法
首先你有一个类似路径:D:\AAA\ProjectNameProjectName是你的项目名此目录下有你从Fmodel里导出的资产,如:Content/UI/UI_HUD.uasset等,你需要将bat放在D:\AAA\目录下,接下来:
-
扫描子目录
ProjectName下全部文件 -
输出
FileList.txt到 bat 所在目录(D:\AAA\FileList.txt) -
每行格式:
"完整本地路径" "../../../ProjectName/相对路径"
同时之前说的打包bat文件也要对应更改:
F:\UE_5.4\Engine\Binaries\Win64\UnrealPak.exe "%~1.pak" -Create=D:\AAA\FileList.txt -compress
将AAA文件夹拖入到此bat文件上即可
我将CreatePakFile.bat放在F:\AUEMod\UnrealPak\MyMod_P\目录下,看一下我的测试输出,FileList.txt:
"F:\AUEMod\UnrealPak\MyMod_P\ModTest\Content\UI\UI_HUD.uasset" "../../../ModTest/Content/UI/UI_HUD.uasset"
"F:\AUEMod\UnrealPak\MyMod_P\ModTest\Content\UI\UI_HUD.uexp" "../../../ModTest/Content/UI/UI_HUD.uexp"
自定义
如果你只想打包 uasset/uexp(过滤其他文件),把for /r "%SOURCE_DIR%" %%f in (*) do (替换,只扫描这两种后缀:
for /r "%SOURCE_DIR%" %%f in (*.uasset *.uexp) do (
UE5Zen修改
这个是只提取日文,在localize_tool.py中的extract_strings,需要将以下代码注释掉
# if not contains_japanese_text(source_text):
# continue
UnrealPak使用
Create时我在网上查到的说可以这样做:UnrealPak.exe D:\out\mymod.pak -Create=D:\out\Staging\ -compress要求 Staging\ 里的目录结构本身就摆成 MyProj\Content\... 的样子。这种方式最适合做 mod,可是我尝试后发现一直无法汉化成功,打开Fmodel查看发现有明显不对的地方:
可以看到ObjectPath没有上级路径,一开始我还以为是Program.cs中RunPack函数的问题,修改后发现并不是,并且我尝试使用无修改的包打出来的pak也是这样,这才锁定到UnrealPak使用的指令有问题(我也有过问Claude,不过他也是说网上说的方法是可以的),反正我按照原始方法写了,一一对应,这样打包后就没问题了
UE5Zen的漏洞
他在生成修改后的json文件时只修改了翻译的文字,没有修改序列化大小和偏移,导致打开游戏后报错:
LowLevelFatalError [File:D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\Serialization\AsyncLoading.cpp] [Line: 3558]
Button /Game/UI/UI_HUD.UI_HUD_C:WidgetTree.Button_76: Serial size mismatch: Got 74, Expected 18
0x00007ff6f6169ae5 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f6179ca9 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f615f1c9 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f6179288 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f618344b UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f617ed2a UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f60efb47 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ff6f60ed431 UnrealGame-Win64-Shipping.exe!UnknownFunction []
0x00007ffdc60b7374 KERNEL32.DLL!UnknownFunction []
Crash in runnable thread FAsyncLoadingThread
所以这个根本不能用,虽然可以改代码,但是还有其他工具可以用,没有必要
UAssetGUI使用
下载UAssetGUI编译的exe后,双击打开,点击选项File->Open选择你从Fmodel导出的.uasset文件,如果打不开点击Utils->Import mappings...导入.usmap文件,按照我的ModTest工程来讲,只有一个UI/UI_HUD.uasset,所以比较简单,如果想批量的话可以去UAssetGUI的git仓库看看指令。
打开UI_HUD.uasset后就可以找到TextBlock将他的值修改,修改后如图:
-
TextBlock不用说,就是类型名
-
Value2是文本的Key,
-
Value3是文本的值未修改时就是:This is my Text Block,
-
Serial Offset就是序列化偏移量,这个值不用手动改,将Value3改值并保存(ctrl+s)之后会自动更新
保存后原来的uasset就会被更改,所以最好有个备份,你可以直接使用修改后的文件用UnrealPak打包,不过会有.bak文件在里面,所以你可以另存为其他地方,这样可以直接使用进行打包
打包好的pak文件放入Content/Paks目录下
存在locres文件不使用IoStore
前面讲述的都是不存在locres文件且不使用IoStore的情况。如果存在.locres文件的话会方便很多
分两种情况:1、作者没有制作语言切换功能,或没有制作切换到中文的功能。2、作者制作了语言切换功能
1、首先使用Fmodel打开,在Folders中找到Localization,右键他,选择Export Folder->Raw Data(.uasset)这样会将文件夹所有文件导出。同时你不能保证Localization不会分散在不同的pak中,因此你需要找全。
2、将导出的文件夹放入一个你认为正确的路径
3、这里体现出两种情况的不同,如果有制作中文语言,你会找到zh相关文件夹;如果没有比如我的测试工程就只有一个en文件夹。但是不论是否存在都只是替换文本文件而已,只不过你替换zh文件夹中的文件不会影响其他语言,你替换了en文件夹中的文件,那么当切换到英文语言时则会显示中文。
4、此处拿en文件夹举例,使用en文件夹中的Game.locres文件拖入到从UE4 Locres Unpacker下载下来的UE4-Locres-Unpacker.exe中,这样会在en文件夹生成一个txt文件,你不要修改文件名,双击打开,翻译其中文字,保存后再将此txt拖入到UE4-Locres-Unpacker.exe,这时会在en文件夹中生成一个Game-new.locres文件,把原来的Game.locres文件和txt文件删除,将Game-new.locres文件重命名为Game.locres
5、删除你没有修改的locres文件,没有必要增加包体
6、打包
补充说明
有的游戏使用的字体不支持中文,因此需要找一个比较像的支持中文的且该字体的FontFace比较全的字体替换掉,我没有做这方面的东西,如果有需要可以参考:替换字体
参考:翻译工具
PS scan timed out - StaticConstructObject_Internal not found on UE 5.6.1.0
在某一次使用UE4SS打开5.6的工程时,尽管debug等设置配置好了还是会有bug无法使用,以下是部分log
[2026-09-08 09:36:46.2706697] DebugGame Setting Enabled? false
[2026-09-08 09:36:46.2751279] PS Scan attempt 1 (Phase 2)
[2026-09-08 09:36:46.2770445] [PS] Reading image
[2026-09-08 09:36:46.2772309] [PS] Starting scan
[2026-09-08 09:36:46.5345505] [PS] Scan finished in 255.5615ms
[2026-09-08 09:36:46.5347023] [PS] Found GUObjectArray: 0x7ff69e589a40
[2026-09-08 09:36:46.5352023] [PS] Found GMalloc: 0x7ff69e499fb0
[2026-09-08 09:36:46.5353916] [PS] Found FName::ToString: 0x7ff696f787c0
[2026-09-08 09:36:46.5355555] [PS] Found FName::FName(wchar_t*): 0x7ff696f675c0
[2026-09-08 09:36:46.5357261] [PS] Failed to find StaticConstructObject_Internal: StaticConstructObjectInternal: expected at least one value
[2026-09-08 09:36:46.5358919] [PS] You can supply your own AOB in 'UE4SS_Signatures/StaticConstructObject.lua'
[2026-09-08 09:36:46.5360502] [PS] Found FUObjectHashTables::Get(): 0x7ff6971bd1f0
[2026-09-08 09:36:46.5362070] [PS] Found GNatives: 0x7ff69e5884c0
[2026-09-08 09:36:46.5363640] [PS] Found ConsoleManagerSingleton: 0x7ff696def1f0
[2026-09-08 09:36:46.5365256] [PS] Found GameEngineTick: 0x7ff699850a10
[2026-09-08 09:36:46.5366869] [PS] Scan failed
之后我参考https://github.com/UE4SS-RE/RE-UE4SS/issues/1197将贡献者提供的lua文件放在了UE4SS_Signatures文件夹中,再次运行就可以了,感谢
下面是文件内容:
function Register()
print("Matching StaticConstructObject\n")
return "4C 8B DC 55 53 41 56 49 8D AB 28 FE FF FF 48 81 EC C0 02 00 00 48 8B ?? ?? ?? ?? ?? 48 33 C4 48 89 85 A0 01 00 00 8B 41 70 33 DB 49 89 73 10 49 89 7B 18 48 8B F9 4D 89 63 20 44 8B 61 18";
end
function OnMatchFound(matchAddress)
print("Found StaticConstructObject at ", matchAddress, "\n")
return matchAddress
end