Repository navigation
Releases: CCB-TEAM/Prism
Release list
Prism v1.2.3
Prism v1.2.3
一张「未压缩」贴图修好了,顺手把贴图替换的两份代码合成了一份。
修好:未压缩贴图替换失败
现象:某些贴图(例如 KARDS 的 T_standard_ammo,看着就是一张普通插图)在桌面端点「替换」
会报 Could not detect a supported pixel format from the asset.,而原始预览完全正常。
原因有两层:
- 这类贴图是
PF_B8G8R8A8(未压缩 32 位彩色),尺寸还不是 2 的幂(2090×2311),
数据全部内联在.uexp里,没有.ubulk; - 桌面端的替换其实是交给
UAssetCLI子进程完成的,而 CLI 为了保持精简,自带了一份
纹理解析代码 —— 那份副本里没有未压缩格式,也还留着「尺寸必须是 2 的幂」的老判断。
于是主程序看得懂、能预览,CLI 一进去就抛异常。
现在 CLI 和主程序共用同一份解析代码:未压缩贴图直接按像素打包,PF_DXT1 用内置 BC1 编码,
两者都不再需要 astcenc / texconv。同类资产(非 2 的幂、没有 ubulk)也一并受益。
顺带
- 替换失败时界面只显示一行原因,完整的 CLI 输出写进日志(之前整段堆栈会铺在替换项上);
- 没有外部编码器时,不再拦掉本来就能内部编码的格式;
- 纹理解析 / mip 回写只剩一份实现(
UAssetTexture.Core),以后不会再出现
「主程序能预览、CLI 替换不了」这种分叉; - 261 项自动化断言全绿,发布包冒烟测试通过。
安装
- Windows:解压 zip,双击
Prism.Desktop.Desktop.exe
(UAssetCLI/与tools/要和它放在同一目录) - Android:直接覆盖安装 apk(
versionCode 10/versionName 1.2.3)
Prism v1.2.2
Prism v1.2.2
手机端这次真的能改音频了,另外修了两个用起来很难受的地方。
手机端支持音频替换
以前只有 Windows 能改音频,因为编码器是个外部 exe,手机上跑不起来。现在 BINKA 编码器
直接编进 App 里(桌面 prism_binka.dll、Android libprism_codecs.so,同一份源码):
手机上选中 SoundWave → 选素材 → 构建 Pak,整条链路都能跑。
桌面端也跟着受益:不再强制需要 tools/binka_encode.exe,内置编码器优先,
exe 只作后备。
手机端选素材不再挑格式
- 没有扩展名的文件(很多下载缓存就是一串哈希名)现在按文件头识别,
不再误报「需要 ffmpeg」——桌面的同一个坑也一起修了; - m4a / aac / flac / opus 交给系统解码器,不用先转格式;
- 认不出来的格式会明说是什么(例如「M4A / MP4 容器」),提示也分桌面/手机两套。
本地化替换页修好了
之前 .locres 加到替换列表只会显示「直接替换字节,不改资产」,翻译编辑器其实一直在,
只是被一个分支顺序挡住了(.locres 是裸文件,不是 .uasset 包)。
现在:搜索词条(连译文一起搜)、直接改译文、回车写回、导出 JSON,
改完列表里会显示「已编辑」而不是一直「待替换」。
cooked 的 locres key 是 CityHash64 哈希,左列看到的是哈希串;按中文内容搜就能定位。
其它
- 252 项自动化断言全绿,发布包自带冒烟测试通过
- Android
versionCode 9/versionName 1.2.2
安装
- Windows:解压 zip,双击
Prism.Desktop.Desktop.exe - Android:直接安装 apk(覆盖安装即可)
Prism v1.2.1
Prism v1.2.1 更新
界面整体重做了一遍,同时加了音频替换、视频替换和音频 / 视频预览。
新增功能
音频替换
选中一个 SoundWave,给它一段 WAV / MP3 / OGG,自动编成游戏用的 BINKA 写回 —— 声道、采样率、时长会一起更新。
音质 0–9 可调;长音频自动分块(跟游戏自己的切块方式一样),整首 BGM 也能换。
视频替换
选中 .mp4 / .bk2 给个新文件即可,按字节替换;选中媒体源资产会自动定位到它引用的那个视频。
手机端也能用。
音频预览
内置播放器:播放 / 暂停 / 进度条拖动。BINKA 音频在桌面端也能直接听(自带解码库)。
视频预览
预览栏里直接播放(静音),带封面帧、时长 / 分辨率、进度条;
没有 ffmpeg 时给「用系统播放器打开」的入口。
界面
- 侧栏可折叠(带拉伸动画),窄窗自动收起
- 欢迎页桌面改成排版版,手机 / 窄窗仍是入口卡片
- 四个工作区逐页重排:小节标签、空状态、控件层级统一
- 设置页改成单列阅读宽度;替换页重排为左右双栏、各自带头部
- 页面切换、悬停、卡片描边都补了过渡动画,不再"瞬切"
修复
- 文件列表的空状态会压在已经打开的 Pak 上
- 选中视频时状态栏只报一句
Object reference not set - 进度条在触摸板 / 触摸屏上拖不动
- 返回上一级后列表停在原来的滚动位置 —— 现在会选中并滚到刚离开的那个目录
- 音频替换原先只能换 1 分钟以内的素材(现在自动分块)
使用说明
- 音频替换仅 Windows 桌面版(编码器是外部 exe);视频替换两端都能用
- 音频替换需要先在设置页选好映射文件(
.usmap/.jmap) - 发行包已自带
tools/binka_encode.exe、tools/ffmpeg.exe与UAssetCLI/,解压即用,别拆开目录
v1.1.2 — Windows 端补上 Oodle 运行时
UE4/UE5 .pak 工具链,Windows 桌面端与 Android 双端。基于 CUE4Parse,扩展自 kardswalker/Prism。
下载
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | Prism-Windows-x64.zip |
自包含单文件版,无需安装 .NET 运行时 |
| Android | Prism-Android.zip |
内含已签名 APK,arm64-v8a |
解压后请保持目录完整 —— UAssetCLI/、tools/ 与 Oodle 运行时必须和主程序放在一起。
本版:Windows 端补上 Oodle 运行时
背景:Android 一直自带 Oodle(liboodle-data-shared.so 通过 AndroidNativeLibrary 打进 APK),但 Windows 端从来没有接过这条路 —— 仓库里没有任何构建机制产出 oo2core_9_win64.dll,它只在少数开发目录里被手工拷过,发布包一直缺它。
后果很严重:设置里勾选「替换时使用 Oodle 压缩」后,打包用的 Rust 库 repak_bind 按名字加载 Oodle 失败 → panic → abort 整个进程(Windows 上 0xC0000409)。这种终止发生在原生层,.NET 的 try/catch、AppDomain.UnhandledException 全都拦不住 —— 用户看到的就是"点一下闪退"。
本版做了两件事:
- Windows 端按 Android 同样的方式接上 Oodle:
third_party/lib/win-x64/oo2core_9_win64.dll,构建与发布都自动复制到主程序旁边。两个平台的 Oodle 压缩现在都是开箱可用。 - 调用前探测 + 自动降级(v1.1.1 引入,本版保留):万一 Oodle 运行时不在,打包会自动改用不压缩并如实报告,而不是崩溃。探测按平台使用正确的库名(Windows
oo2core_9_win64.dll/ Androidliboodle-data-shared.so)。
Oodle 属于 RAD Game Tools / Epic Games,受虚幻引擎 EULA 约束;相关说明见仓库内
third_party/README.md。
上一版(v1.1.1)的内容
- 修复开启「Oodle 压缩」时闪退(探测 + 降级)
- 设置页「信息」新增 Oodle 状态行
v1.1.0 的内容
- 主题切换:跟随系统 / 浅色 / 深色。浅色主题在大屏上是一整片亮面,深色主题正文为纯白(15.1:1)
- 只放大文字,不再整体缩放控件与间距
- 宽屏两列布局 —— 设置页从"比窗口还高"变成"一屏看全"
- 对比度修复 —— 卡片标题 2.5:1 → 5.4:1
- 说明文字收进各页共用的「使用说明」浮层
app.manifest补上 DPI 感知声明(高分屏不再位图拉伸)
安装
Windows:解压后运行 Prism.Desktop.Desktop.exe。
Android:安装 android/Prism-Android-Signed.apk。
签名说明:Android 包由 .NET Android 用调试证书签名(
CN=Android Debug,SHA-176:DB:3A:E3:E2:5A:CB:6D:76:7B:22:34:E4:EA:98:53:B0:7D:E6:A3),与上一版一致,可直接覆盖安装并保留数据。调试证书仅适合自用与内部分发。
已知限制
- 只支持
.pak;未实现.utoc/.ucas。 - 不内置映射文件,需从游戏中自行导入。
- 需要 AES 密钥的 pak,请在设置页填入。
- 跨格式转换需要映射文件(
.usmap/.jmap);缺映射的贴图会被跳过并在明细里说明。 - 本地化三路合并只在提供基准文件时生效。
- 浏览页左侧列表宽度固定,还不能拖动调整。
- 解包不需要 Oodle:只有解压 Oodle 压缩的条目时才用到,而多数 mod / 补丁 Pak 并非 Oodle 压缩。实测在不含 Oodle 运行时的环境里读取 Pak 完全正常。
校验
见 SHA256SUMS.txt。
许可
GPL-3.0,继承自上游。见仓库内 LICENSE 与 NOTICE。
v1.1.1 — 修复开启 Oodle 压缩时闪退
UE4/UE5 .pak 工具链,Windows 桌面端与 Android 双端。基于 CUE4Parse,扩展自 kardswalker/Prism。
下载
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | Prism-Windows-x64.zip |
自包含单文件版,无需安装 .NET 运行时 |
| Android | Prism-Android.zip |
内含已签名 APK,arm64-v8a |
解压后请保持目录完整 —— UAssetCLI/ 与 tools/ 必须和主程序放在一起。
本版修复:开启「Oodle 压缩」会直接闪退
现象:设置里勾上「替换时使用 Oodle 压缩」后,执行 Pak 合并(或转换、构建补丁)时程序瞬间消失,没有任何报错。
原因:打包用的是 Rust 写的 repak_bind,它在做 Oodle 压缩时会去加载 oo2core_9_win64.dll。发行包按授权约定不包含这个库,于是加载失败 → Rust panic → abort 整个进程。Windows 上表现为 0xC0000409,进程直接消失。
关键在于:这种 abort 在 .NET 侧完全拦不住 —— try/catch、AppDomain.UnhandledException、TaskScheduler.UnobservedTaskException 都无效,因为进程是被原生代码终止的。所以不能靠"捕获异常再提示",只能在调用前判断。
修复:打包前先探测 Oodle 原生库是否可加载(NativeLibrary.TryLoad)。
- 可用 → 照常按 Oodle 压缩;
- 不可用 → 自动退回不压缩,打包继续完成,并在日志与页面上说明原因;
- 设置页「信息」新增一行 Oodle 状态,一眼能看出为什么没有压缩。
这样即使勾着 Oodle 压缩,也不会再闪退 —— 只是输出包大一些(不压缩)。
想真正用上 Oodle 压缩:把 oo2core_9_win64.dll 放到 Prism.Desktop.Desktop.exe 旁边即可(可从虚幻引擎安装目录取得,例如 Engine\Binaries\DotNET\UnrealBuildTool\)。发行包不含它是因为其再分发受 RAD/Epic 授权约束。
顺带说明:解包不需要 Oodle
有用户问"没有 Oodle 怎么解包" —— 实测(在一份不含 oo2core 的包里)读取 Pak 完全正常:98 个文件、搜索、贴图预览全部成功。Oodle 只在需要解压 Oodle 压缩的条目时才用到,而多数 mod / 补丁 Pak 并不是 Oodle 压缩的。只有写入时勾选 Oodle 压缩才会触发上面这个崩溃。
上一版(v1.1.0)的内容
- 主题切换:跟随系统 / 浅色 / 深色。浅色主题在大屏上是一整片亮面,深色主题正文为纯白(15.1:1)
- 只放大文字,不再整体缩放控件与间距
- 宽屏两列布局 —— 设置页从"比窗口还高"变成"一屏看全"
- 对比度修复 —— 卡片标题 2.5:1 → 5.4:1(原先 142 处
Opacity压暗把对比度乘没了) - 说明文字收进各页共用的「使用说明」浮层
app.manifest补上 DPI 感知声明(高分屏不再位图拉伸)
安装
Windows:解压后运行 Prism.Desktop.Desktop.exe。
Android:安装 android/Prism-Android-Signed.apk。
签名说明:Android 包由 .NET Android 用调试证书签名(
CN=Android Debug,SHA-176:DB:3A:E3:E2:5A:CB:6D:76:7B:22:34:E4:EA:98:53:B0:7D:E6:A3),与上一版一致,可直接覆盖安装并保留数据。调试证书仅适合自用与内部分发。
已知限制
- 只支持
.pak;未实现.utoc/.ucas。 - 不内置映射文件,需从游戏中自行导入。
- 需要 AES 密钥的 pak,请在设置页填入。
- 跨格式转换需要映射文件(
.usmap/.jmap);缺映射的贴图会被跳过并在明细里说明。 - 本地化三路合并只在提供基准文件时生效。
- 浏览页左侧列表宽度固定,还不能拖动调整。
校验
见 SHA256SUMS.txt。
许可
GPL-3.0,继承自上游。见仓库内 LICENSE 与 NOTICE。
v1.1.0 — 界面重做:主题切换 / 可读性 / 宽屏布局
UE4/UE5 .pak 工具链,Windows 桌面端与 Android 双端。基于 CUE4Parse,扩展自 kardswalker/Prism。
下载
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | Prism-Windows-x64.zip |
自包含单文件版,无需安装 .NET 运行时 |
| Android | Prism-Android.zip |
内含已签名 APK,arm64-v8a |
解压后请保持目录完整 —— UAssetCLI/ 与 tools/ 必须和主程序放在一起,贴图替换与 Pak 转换依赖它们。
换到新目录首次运行时,请在「设置」页确认 AES 密钥已填 —— 新目录没有旧设置文件,密钥为空时加密 Pak 读不出任何文件(会直接报错,不会产出废包)。
本版重点:界面重做(可读性 + 主题)
上一版的界面是按手机尺寸设计的,在 1920 宽的桌面上字小、内容挤在中间一列、说明文字又多。这一版把界面重新做了一遍,每一步都基于实测数据。
1. 新增主题切换:跟随系统 / 浅色 / 深色
浅色主题在 1920 屏幕上就是一整片亮面,长时间看眼睛累。深色主题其实早就写好了,只是跟着系统走,系统是浅色就一直用不上。
现在「设置 → 通用 → 主题」可以直接切换,会持久化,下次启动自动套用。深色主题下的正文是纯白(对卡片 15.1:1)—— 深底白字不会刺眼,与浅色主题的处理方向正好相反。
2. 只放大文字,不再整体缩放
最初试过把整个界面等比放大 1.2 倍,结果是内边距、控件、行高一起变大 —— 读起来像"把手机界面拉大",而且页面更高、一屏能看到的东西反而更少。
现在字号走应用级资源:宽屏时只替换这一组字号的值,内边距与控件尺寸完全不变。
3. 宽屏用宽度换高度
设置页有 8 张卡片,竖排时比窗口还高,一屏只能看到三张半、必须滚动。宽屏改为两列:一屏能看到六张。合并页同样两列(待合并列表与输出并排),整页缩到屏幕上方三分之一。
窗口宽度低于 1200px 自动回到紧凑单列 —— 手机端布局完全不变。
4. 修掉被 Opacity 压没的对比度
界面发灰发糊的根因不是字号,是对比度。全项目有 142 处用 Opacity 压暗文字,而 Opacity 是乘性压暗:
| 文字用途 | 修复前 | 修复后 | 标准(正文 ≥4.5) |
|---|---|---|---|
| 正文 | 17.4:1 | 17.4:1 | ✅ |
| 卡片标题 | 2.5:1 | 5.4:1 | ✅ |
| 字段标签 | 1.87:1 | 5.4:1 | ✅ |
| 提示文字 | 1.76:1 | 5.4:1 | ✅ |
142 处 Opacity 全部去掉,层次改由字号与字重表达。
5. 两套主题的配色都按"看着不累"调过
浅色主题原本是纯黑正文 + 纯白卡片 = 21:1,过曝刺眼。现在:
| 浅色主题 | 深色主题 | |
|---|---|---|
| 正文 | #33322e(11.6:1) |
#ffffff(15.1:1) |
| 次要文字 | #67665f(5.2:1) |
#b6b6ba(7.5:1) |
| 卡片 | #f4f3f0 |
#262629 |
| 页面底色 | #e4e3e0 |
#1b1b1d |
6. 说明文字收进共用的「使用说明」浮层
各主要页面顶栏都有「使用说明」按钮,点开是各页共用的页内浮层,按主题切换内容(含操作步骤与截图)。页面正文只留状态与必须看到的提示。
7. 修复:缺少 DPI 感知声明
app.manifest 原先完全没有 DPI 感知声明。在 125% / 150% 缩放的屏幕上,Windows 会把整个窗口当成位图拉伸 —— 那才是真正的"字发虚"。现已声明 per-monitor v2。
上一版(v1.0.2)的内容
- 修复 Pak 转换在桌面端几乎全部失败(39 张贴图原先只成功 1 张)
- 新增「并入模组的其他文件」开关,免去再单独合并一次
- 转换挂载到 0 个文件时直接报错,不再产出废包
- Pak 合并去掉钉死的主 Pak,优先级改为越靠上越高
- 新增「基准本地化」三路合并 —— 两份各改不同文本的模组现在能真正合并
安装
Windows:解压后运行 Prism.Desktop.Desktop.exe。
Android:安装 android/Prism-Android-Signed.apk。
签名说明:Android 包由 .NET Android 用调试证书签名(
CN=Android Debug,SHA-176:DB:3A:E3:E2:5A:CB:6D:76:7B:22:34:E4:EA:98:53:B0:7D:E6:A3),与上一版一致,可直接覆盖安装并保留数据。调试证书仅适合自用与内部分发;若需公开分发或上架,请用正式密钥库重签(换签名后需先卸载旧版)。
已知限制
- 只支持
.pak;未实现.utoc/.ucas。 - 不内置映射文件,需从游戏中自行导入。
- 需要 AES 密钥的 pak,请在设置页填入。
- 跨格式转换需要映射文件(
.usmap/.jmap);缺映射的贴图会被跳过并在明细里说明。 - 本地化三路合并只在提供基准文件时生效;没有基准时同名
.locres仍是整份覆盖。 - 浏览页左侧列表宽度固定,还不能拖动调整。
- 本包不含 Oodle 原生库(
oo2core_9_win64.dll):它的再分发受 RAD/Epic 授权约束,项目一贯不随包分发。默认「替换时使用 Oodle 压缩」是关闭的,所以打包不受影响;若你要在发行版里打开它,请把该 DLL 放到Prism.Desktop.Desktop.exe旁边即可(可从虚幻引擎安装目录取得)。
校验
见 SHA256SUMS.txt。
许可
GPL-3.0,继承自上游。见仓库内 LICENSE 与 NOTICE。
v1.0.2 — 转换修复 / 合并优先级 / 本地化三路合并
UE4/UE5 .pak 工具链,Windows 桌面端与 Android 双端。基于 CUE4Parse,扩展自 kardswalker/Prism。
下载
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | Prism-Windows-x64.zip |
自包含单文件版,无需安装 .NET 运行时 |
| Android | Prism-Android.zip |
内含已签名 APK,arm64-v8a |
解压后请保持目录完整 —— UAssetCLI/ 与 tools/ 必须和主程序放在一起,贴图替换与 Pak 转换依赖它们。
换到新目录首次运行时,请在「设置」页确认 AES 密钥已填 —— 新目录没有旧设置文件,密钥为空时加密 Pak 读不出任何文件(本版已加了拦截,会直接报错而不是产出废包)。
本版内容
1. 修复 Pak 转换在桌面端几乎全部失败
现象:PC 模组 Pak → 手机 Pak 的转换,39 个候选纹理里 38 个失败,只有目标格式为 DXT1、走内置编码器的那一张成功。
根因:目标格式要等 CLI 打开主 Pak 的模板资产才知道,所以调用方传的格式是空字符串;而参数组装靠"格式是否以 PF_ASTC_ 开头"决定传 --astcenc 还是 --texconv,空字符串落到了 --texconv 分支。astcenc 不在 PATH 上(随应用放在 tools/),CLI 于是报 Could not find encoder tool,每个 ASTC 目标都以失败告终。
现已改为两个编码器路径都传,由 CLI 按目标格式自行选择。实测:39/39 全部成功,输出 14.3 MB,耗时约 50 秒。
2. 新增「并入模组的其他文件」开关
模组除了换贴图,往往还改了蓝图、.locres 本地化、数据表等。这些内容两个平台通用,不需要转换,直接原样放进输出 Pak 即可 —— 开了这个开关就不必再单独做一次 Pak 合并,输出体积仍≈改动量。
已成功转换的贴图不会被源文件覆盖(否则会把源平台的像素格式塞进目标 Pak);没能转换的贴图仍会带入并报出原因,不静默丢件。
实测(同一对 Pak):默认模式 40 条目 / 14.29 MB 且不含 Game.locres;开启后 41 条目 / 15.21 MB,Game.locres 已并入。
3. 转换挂载到 0 个文件时立刻中止(不再产出废包)
加密 Pak 在没有(或错误)AES 密钥时,挂载会"成功"但一个文件都读不出来,且不抛异常。此前这会一路走下去:主 Pak 索引为空 → 所有纹理都判成"主 Pak 中没有同路径" → 若开了「并入模组文件」,还会把源 Pak 全部文件原样打进去,产出一个没有任何贴图被转换的假包,并且报告"失败 0"。
现在会直接报错并说明原因(未挂载到归档 / 加密但未提供密钥 / 密钥不匹配)。转换页也把「密钥 / 映射」状态显示出来了。
4. Pak 合并:去掉固定的主 Pak,优先级方向修正
- 列表每一项都能拖动排序、都能移除,「清空」真的清空 —— 不再有钉死的第一项。
- 优先级改为越靠上越高(第 1 项最高)。此前是反的(越靠下越高),现在符合直觉。
5. 新增「基准本地化」三路合并:两份文本模组可以真正合并了
以前两份各改了不同文本的模组没法合并 —— 同名 .locres 只能整份覆盖,靠上的那份胜出,另一份的改动全部丢失。
原因是:两份模组对每一条词条都有值(改过的与没改的混在一起),只对比这两份文件无法判断某个词条是谁改的。必须有游戏原版当参照。
现在合并页多了一行「基准本地化(可选)」:
- 把游戏原版的
.locres选进去(可用「解包 & Mod」页从原版 Pak 里导出)→ 同名.locres逐条与基准对比,各模组的改动叠加,未被改动的词条保持原版。 - 同一词条被多份模组改动时,按列表优先级取高者。
- 不选基准则完全保持原来的整文件覆盖,行为可预期。
- 其它资产仍按覆盖处理(二进制资产无法逐条合并)。
- 完成后会报告:
本地化逐条合并 N 个文件(生效改动 M 条,冲突 K)。
实测(真实文本包,13,476 条词条):
| 做法 | A 改的词条 | B 改的词条 |
|---|---|---|
| 整文件覆盖(旧) | 保留 | 丢失 |
| 三路合并(新) | 保留 | 保留 |
6. 界面精简
转换页正文原先堆了 9 段长说明,而实际要填的只有三行输入。现在正文只保留三行输入、两个开关和两条必要提示(正文文字从约 500 字压到 61 字),说明收进顶栏的 「使用说明」 按钮 —— 点开是页内浮层,含操作步骤与截图。设置页、合并页、工作区页里几处啰嗦说明也一并收紧。
安装
Windows:解压后运行 Prism.Desktop.Desktop.exe。
Android:安装 android/Prism-Android-Signed.apk。
签名说明:Android 包由 .NET Android 用调试证书签名(
CN=Android Debug,SHA-176:DB:3A:E3:E2:5A:CB:6D:76:7B:22:34:E4:EA:98:53:B0:7D:E6:A3),与上一版一致,可直接覆盖安装并保留数据。调试证书仅适合自用与内部分发;若需公开分发或上架,请用正式密钥库重签(换签名后需先卸载旧版)。
已知限制
- 只支持
.pak;未实现.utoc/.ucas。 - 不内置映射文件,需从游戏中自行导入。
- 需要 AES 密钥的 pak,请在设置页填入。
- 跨格式转换需要映射文件(
.usmap/.jmap);缺映射的贴图会被跳过并在明细里说明。 - 本地化三路合并只在提供基准文件时生效;没有基准时同名
.locres仍是整份覆盖。 - 本包不含 Oodle 原生库(
oo2core_9_win64.dll):它的再分发受 RAD/Epic 授权约束,项目一贯不随包分发。默认「替换时使用 Oodle 压缩」是关闭的,所以打包不受影响;若你要在发行版里打开它,请把该 DLL 放到Prism.Desktop.Desktop.exe旁边即可(可从虚幻引擎安装目录取得,例如Engine\Binaries\DotNET\UnrealBuildTool\)。
校验
见 SHA256SUMS.txt。
许可
GPL-3.0,继承自上游。见仓库内 LICENSE 与 NOTICE。
v1.0.1 — 双端发行版(修复贴图替换)
UE4/UE5 .pak 工具链,Windows 桌面端与 Android 双端。基于 CUE4Parse,扩展自 kardswalker/Prism。
下载
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows | Prism-Windows-x64.zip |
自包含单文件版,无需安装 .NET 运行时 |
| Android | Prism-Android.zip |
内含已签名 APK,arm64-v8a |
解压后请保持目录完整 —— UAssetCLI/ 与 tools/ 必须和主程序放在一起,贴图替换与 Pak 转换依赖它们。单独把 exe 拷走会导致这两个功能不可用(应用启动时会在日志里提示"未找到 UAssetCLI")。
本版重点:修复贴图替换完全不可用
此前在部分资产上,替换贴图会静默失败——日志停在最后一级 mip 之后,没有任何错误提示。
根因是纹理尺寸被写死在导出数据的固定偏移(exportData[4] / exportData[8])。对部分资产该偏移恰好正确,但 KARDS 这类资产在导出数据前还有一段内联元数据,尺寸三元组落在 offset 80,于是读到 15x0 被当作真实尺寸:
- mip 链整条错位,11 级 mip 只解析出 1 级;
- 编码阶段因此只处理了最后一级;
- 写回时
Buffer.BlockCopy越界 → 进程带着异常结束。
现已改为扫描所有 (宽, 高, 深度=1) 三元组、过滤非 2 的幂与超范围值,按面积从大到小逐个尝试,取第一个能解析出完整 mip 布局的候选。
同类缺陷在 UAssetTexture.Core(Android 端替换与双端 Pak 转换所用)中一并修复:
- 资产没有
.ubulk时,载荷之后的FByteBulkData头会被误认成"外部 mip",抢先返回一个只有一级 mip 的残缺布局; - 内联 mip 的载荷偏移公式隐含"每级元数据长度恒定",而实测长度逐级不同,从第二级起会静默产出损坏贴图(不报错)。
另外补上 FString 长度的负向校验:原先只校验上界,负数长度会经未检查的溢出喂给 stackalloc,而栈溢出在 .NET 中无法捕获,会直接杀进程。
实测(真实资产 T_stz_5_katyusha,1024×1024 DXT1、无 .ubulk、mip 全内联):
| 修复前 | 修复后 | |
|---|---|---|
| 解析出的 mip | 1 级(4×4) | 11 级(1024×1024 → 1×1) |
| 替换结果 | 崩溃 | 成功,输出结构不变 |
| 各级载荷 | 未处理 | 11 级全部正确改写,颜色与源图吻合 |
功能
- 浏览与预览:挂载
.pak,预览贴图 / 音频 / 三维网格 / 本地化 / 蓝图伪代码,导出与分享 - 贴图替换:选图即生成补丁 pak
- Pak 合并:多选 + 长按拖动调整覆盖优先级
- Pak 转换:把另一平台 pak 中的同路径贴图移植过来,按主 pak 格式重编码;默认只输出改动资产(7 GB 主 pak + 1 贴图 → 685 KB)
- 本地化:编辑
.locres、导出为 JSON,四种格式版本往返安全 - 映射:
.usmap与.jmap(含.gz)按扩展名自动识别
安装
Windows:解压后运行 Prism.Desktop.Desktop.exe。
Android:安装 android/Prism-Android-Signed.apk。
签名说明:Android 包由 .NET Android 用调试证书签名(
CN=Android Debug,SHA-176:DB:3A:E3:E2:5A:CB:6D:76:7B:22:34:E4:EA:98:53:B0:7D:E6:A3),与上一版一致,可直接覆盖安装并保留数据。调试证书仅适合自用与内部分发;若需公开分发或上架,请用正式密钥库重签(换签名后需先卸载旧版)。
已知限制
- 只支持
.pak;未实现.utoc/.ucas。 - 不内置映射文件,需从游戏中自行导入。
- 需要 AES 密钥的 pak,请在设置页填入。
校验
见 SHA256SUMS.txt。
许可
GPL-3.0,继承自上游。见仓库内 LICENSE 与 NOTICE。