尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何用 UEViewer 吃透 Unreal 1-4 资源格式:从第一条导出命令到看懂包文件解析源码

如何用 UEViewer 吃透 Unreal 1-4 资源格式:从第一条导出命令到看懂包文件解析源码 如何用 UEViewer 吃透 Unreal 1-4 资源格式从第一条导出命令到看懂包文件解析源码【免费下载链接】UEViewerViewer and exporter for Unreal Engine 1-4 assets (UE Viewer).项目地址: https://gitcode.com/gh_mirrors/ue/UEViewerUEViewer社区更熟悉它的短名 umodel是一个把 Unreal Engine 1 到 4 的打包资源重新翻译成可编辑格式的开源工具覆盖三百多款游戏资产是目前该领域覆盖度最高的方案之一。本文按一条实际的使用路径推进先跑通最小用例再顺着源码把包文件解析—对象反序列化—格式导出这条主链拆开最后聊聊它留给开发者的扩展空间。一个老工具凭什么通吃二十年UEViewer 的源码从 2007 年开始累积作者在 readme.txt 里写得很直白最初只是给自己骨骼动画系统做的一个小测试后来从 UT2004 model viewer 一路演变成通用查看器。二十年跨度意味着它面对的不是一个稳定格式而是四代引擎、数百个游戏厂商对同一格式的各自篡改。这正是它最值得拆解的地方一个古董代码库凭什么还能打开最新的 UE4.27 打包内容答案藏在它的两层设计里——一层是用同一套结构抽象不同版本另一层是把游戏特例隔离在条件编译之外。前者让它活得久后者让它改得快。五秒钟跑通第一条导出命令不需要图形界面UEViewer 本质上是个命令行程序。把包文件路径直接传给可执行文件就能进入查看模式想要全量导出则是umodel -export加包名。它接受.upk、.xxx、.ukx、.pak等几乎所有虚幻系扩展名也可以把文件拖到图标上启动不过那样会跳过兼容性参数某些魔改游戏就导不出来了。几个值得一提的细节-md5开关会把骨骼网格和动画导出成 idTech 的 md5mesh/md5anim 格式-pskx是作者为容纳 psk 标准装不下的额外信息而扩展的变体CtrlS 截图、CtrlX 导出当前场景、CtrlG 在 OpenGL 2.0 着色器路径和 1.1 固定管线之间切换。GUI 只是个外壳命令行选项在图形模式下依然全部生效这套命令行内核 可选 GUI的架构让它在服务端批量处理场景里同样好用。第一次跑通后自然会问它到底对包文件做了什么这就进入核心了。包文件解析整个工具的地基Unreal 的打包内容cooked 之后的.pak/.uasset本质上是一个自描述的二进制仓库文件头之后是名称表、导入表、导出表最后是真正的内容数据。UEViewer 的解析入口在 Unreal/UnrealPackage/ 目录其中 UnPackage.cpp 负责主干流程而 UnPackage2/3/4.cpp 分别承载 UE1-2、UE3、UE4 的差异。读 UnPackage.h 里的 FPackageFileSummary 结构体能直观感受到版本演进的压力UE3 时代多了压缩块表FCompressedChunk、包组名、依赖偏移UE4 时代又追加了引擎版本对象和自定义版本容器FCustomVersionContainer。同一个结构体用条件编译包住三代字段这正是它一套代码吃四代的第一层秘密。第二层秘密在 UE4 的 pak 支持里。Unreal/FileSystem/UnArchivePak.h 顶部那张 pak 格式版本表很有代表性从 v1 的朴素索引到 v3 引入压缩与加密、v4 加密索引、v7 支持多密钥、v10 把所有文件路径改成 64 位哈希。每个版本对应 UE4 的一个大版本区间注释里甚至记录了 4.22 和 4.23 同为 v8 但结构不同这种坑。版本号不是随便写的宏而是和序列化逻辑绑定的枚举任何新版本出现时改动点都收敛在一两个文件里。版本差异不是 if-else 堆出来的读 Unreal/UE4Version.h 时有个很舒服的体验UE4 的每一个文件版本变更都被列成带注释的枚举从 VER_UE4_0342 一路到 522中间插着大量结构变更点比如支持 8 骨骼权重静态网格支持 32 位索引移除 Net 索引。注释里还专门解释了为什么 4.0 和 4.1 可以共用一个版本常量——因为它们对 UEViewer 关心的对象格式没有任何影响。这种只跟进自己需要的内容、其余格式变更直接跳过的取舍是它二十年里始终能保持小体量的关键。处理无版本号unversioned包时UEViewer 靠游戏代号反推引擎版本每个游戏映射到一个 GAME_xxx 常量再根据游戏基于哪个引擎版本推断结构布局。Unreal/GameDatabase.h 里那张游戏信息表GListOfGames就是整个兼容体系的索引。这种以游戏为锚点而不是以文件版本为锚点的思路恰恰是它比通用解析器更懂魔改游戏的原因。材质和网格二进制到可编辑数据的翻译解析完包结构下一步是把对象反序列化成可操作的数据。Unreal/UnrealMesh/ 下的 UnMesh.h 定义了网格侧的公共类型FMeshUVFloat 与半精度 UV 的隐式转换、VJointPos 里骨骼朝向和位置的序列化都能看到针对不同引擎版本的分支处理——比如 EndWar 的 FVector 里多了个 W 分量、ArmyOf2 在骨骼数据后塞了一个填充字段。材质侧更有意思。Unreal/UnrealMaterial/ 里从 UnMaterial.h 到 UnMaterial3.h 按代划分UnMaterialExpression.h 则定义了材质表达式节点网络。UE3/UE4 的材质是一个巨大的表达式树叶子是纹理采样内部节点是各种数学运算。UEViewer 不追求把整棵树还原而是识别出 Diffuse、Opacity、Normal 等关键输出支路把它们折叠成可导出的信息——这解释了为什么它能导出材质参数却不需要运行 UE 编辑器。Docs/material.txt 里那些关于 Shader 与 FinalBlend 组合规则的笔记记录了这些折叠规则是如何一条条被验证出来的读起来像是作者的逆向工作日志。导出层是一张对象到函数的注册表理解了数据剩下就是把内部表示写出去。Exporters/ 目录的 Exporters.h 给出了一套极简插件式设计RegisterExporter(ClassName, Func)把对象类名映射到导出函数UmodelTool/Main.cpp 启动时通过BEGIN_CLASS_TABLE / REGISTER_MESH_CLASSES_U4这类宏批量注册类表。导出时根据对象的类名查表分发新增一种格式只需要写一个函数并注册不需要改动主流程。各格式的取舍在源码里看得很清楚psk/psaActorX 系骨骼网格与动画的正统格式配套 3ds Max 导入脚本能力最全md5mesh/md5anim轻量、跨工具友好但骨骼层级取自网格而非动画部分查看器不认glTFExportGLTF.cpp 里做了坐标系转换——Unreal 左手系 Z 轴朝上换成 glTF 右手系 Y 轴朝上单位从厘米换成米材质则降级成 PBR 参数占位。这个列表本身就是决策依据追求保真选 psk追求通用选 glTF临时预览用 md5。值不值得改造它几个可下手的扩展点通读源码后UEViewer 适合三类人做游戏资源考古的研究者、需要批量提取资产做数据集的内容生产团队、以及想给自有引擎补兼容层的工具开发者。它的扩展路径相当清晰想在 Unreal/GameSpecific/ 加一个新游戏的适配照着 UnMeshRune.cpp 或 UnUbisoft.cpp 的骨架填差异即可想在 Exporters/ 加一个新格式写一个导出函数注册进去就能被主流程接管想深挖材质UnMaterialExpression.h 里的表达式注册表是现成的挂载点。值得留意的边界是UE5 的格式已超出它的支持范围虚幻官方对资源加密的持续收紧也让部分新作需要额外的密钥和逆向工作。作为学习素材仓库里还附带 Tools/ 下若干独立小工具包提取、类型信息分析它们共用同一套序列化基础是理解 FArchive 机制最好的入门读物。一句话收束UEViewer 的价值不在某个炫技功能而在于它示范了对一个持续演变的二进制格式如何用最小成本维持最长久的兼容——这份设计经验比它导出的任何模型都值钱。【免费下载链接】UEViewerViewer and exporter for Unreal Engine 1-4 assets (UE Viewer).项目地址: https://gitcode.com/gh_mirrors/ue/UEViewer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表