ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AssetRipper 数据存储完全指南:配置是怎么存下来的,一次看懂

AssetRipper 数据存储完全指南:配置是怎么存下来的,一次看懂 AssetRipper 数据存储完全指南配置是怎么存下来的一次看懂【免费下载链接】AssetRipperGUI application to analyze game files项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipperAssetRipper 是一款用于分析和提取 Unity 游戏文件的工具本文带你快速看懂它背后的数据存储系统你改的每一项设置是如何被打包、持久化、再原样读回的。第一次打开 AssetRipper 时设置面板里那些下拉框——Mesh 导出格式、音频导出格式、脚本反编译等级——看起来平平无奇。但你重启工具后它们都还记得命令行和 Web 界面也共享同一份记忆。这些记忆靠的就是 AssetRipper 内部一套独立的数据存储模块每个条目既是内存里活着的 C# 对象又是一段可以随时落盘的文本读和写通过一个叫Text的属性自动完成打包与拆箱。为什么工具要记事先想清楚需要记住什么一次完整的 Unity 资产提取工具必须记住的东西其实很多导出到哪个目录、纹理要不要解析、C# 脚本反编译到哪个等级、引擎资源数据怎么映射……而且这些记忆有三重身份跨会话存活关掉工具再打开设置还在多处共享GUI、Web 界面、导出管线读的是同一份可落盘能整体存成文件下次直接加载。AssetRipper 的解法不是给每种设置写一个属性文件而是做一个通用的配置档案柜所有设置都变成档案柜里的条目按名字key存取。档案柜三层结构柜子、盒子、打包工这套机制的源码集中在 Source/AssetRipper.Configuration/ 目录拆开看只有三层。第一层是柜子。DataStorageT内部就是一个Dictionarystring, T提供了索引器、Add、Clear和TryGetValue。其中TryGetValue值得注意它不仅判断 key 在不在还会把取出的值as转成你要求的派生类型——key 存在但装的不是这种盒子会直接返回 false相当于取档案时顺手核对了标签。第二层是盒子。柜子只分两种盒子DataInstanceT装单件东西的盒子里面是一对孪生数据——活对象Value和文本形式TextDataSetT装一列东西的盒子底层是ListT对外还能通过Strings把整个列表当成字符串列表读写。SingletonDataStorage和ListDataStorage分别就是只放单件盒子和只放列表盒子的两种柜子业务代码里FullConfiguration同时持有这两个柜子ImportSettings、ExportSettings、ProcessingSettings都躺在SingletonData里。第三层是打包工。每种盒子构造时都会注入一个DataSerializerT它只有三件事可做把对象变成文本Serialize、把文本变回对象Deserialize、造一个全新空值CreateNew。追一条设置的完整旅程从下拉框到磁盘以把音频导出格式改成 Default为例看看数据走过的路GUI 修改设置写回内存里的ExportSettings对象调用SaveToDefaultPath()三个设置对象被 JSON 化后打包进一个本地配置文件下次启动LoadFromDefaultPath()把文件拆箱还原成对象写回档案柜。真正巧妙的是盒子内部这座桥。DataInstanceT的Text属性是读写不对称的public sealed override string Text { get serializer.Serialize(Value); // 取出时打包 set Value serializer.Deserialize(value); // 写入时拆箱 }也就是说同一个条目永远有对象和文本两副面孔互相之间自动转换。Web 界面的配置文件编辑页正是吃这个设计用户粘贴一段 JSON 文本直接赋给Text拆箱动作在赋值那一刻自动完成无需任何额外胶水代码。序列化机制速览三种打包方式一种宽容脾气DataSerializerT目前有三种实现对应盒子的三种材质实现类装什么打包/拆箱方式失败时StringDataSerializer纯字符串原样透传不会失败ParsableDataSerializerT可解析类型枚举、数字等TryParse/ToString回退到CreateNew()空值JsonDataSerializerT任意配置对象JsonSerializer 预编译的JsonTypeInfo吞掉异常返回空值注意后两种的脾气坏文本不会让程序炸掉而是悄悄换一个全新默认值。这意味着你手改设置文件写错了格式工具重启后大概率是设置回默认而不是崩溃——这对一个要处理各种来路配置的工具来说是很稳的设计。JsonDataSerializer用的JsonTypeInfo来自源生成上下文如SerializedSettingsContext序列化元数据在编译期就准备好了运行期零反射开销。查询接口层取不到时怎么办日常取数据主要靠三种姿势// 确定的取法拿不到直接抛异常 ImportSettings settings configuration.SingletonData.GetStoredValueImportSettings(ImportSettings); // 试探的取法拿不到就返回 false configuration.SingletonData.TryGetStoredValue(nameof(EngineResourceData), out EngineResourceData? data); // 顺手建档没有就先建一个默认盒子 configuration.SingletonData.GetOrAdd(key).Text content;第三种GetOrAdd定义在 DataExtensions.cs是 Web 端增删改页面的地基表单提交时如果 key 还不存在就现造一个StringDataInstance放进柜子再写入一次赋值同时完成建档 拆箱。实用技巧给使用者的三条建议想改高级行为别怕进配置文件页Web 界面把SingletonData单件和ListData列表两个柜子都暴露成了可编辑的键值表高级用户可以直接以 JSON 文本形式改条目——它走的就是前文那座Text桥。改错了就删删掉某个条目后对应设置会回到构造时的默认值Clear()会把柜子里所有条目复位成全新空值这是ResetToDefaultValues()的核心动作。找源码只认一个目录整个配置层不到 20 个文件全部在Source/AssetRipper.Configuration/业务层的包装属性在 FullConfiguration.cs读它最快理解谁在用这套存储。这套存储机制让 AssetRipper 把记住设置这件小事做成了可插拔的通用层对象和文本互转交给打包工存取交给档案柜业务只管按名字找盒子。写设置不写文件操作读配置不碰序列化细节坏数据自动降级不拖垮主流程。三层各司其职一份配置服务 GUI、Web、导出管线三方。【免费下载链接】AssetRipperGUI application to analyze game files项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表