示例 · 配置 Config
从 items.csv 读一份真实物品数据(8 行,含价格/堆叠/重量/稀有度/类别),运行期 Build 成 ConfigBlobTable<T> 注册——配置即数据,不在代码里写死。
文件:HycSimpleItemRow.cs / HYCSimpleConfigDemoSystem.cs / Resources/items.csv
心智模型
- 模板 / Excel → 生成期:
ConfigTemplate+ConfigFieldType描述表结构;ConfigGenerator据此生成CfgXxx行结构体([BlobGenerate],blittable,含BlobString)、XxxBlobSystem(引导期把.blob读回并ConfigRegistry.Register)、枚举类。 - 运行期:任意代码用生成式门面
{ns}.ConfigManager.{Type}.GetByID(id)查表,无需 World 句柄。
真实项目链路(5 步)
① 建模板 编辑器里定义 ConfigTemplate(加字段,枚举字段引用 ConfigEnumDefinition)
② 生成代码 HYC Framework/Config/1-生成配置模板与代码 → CfgXxx + XxxBlobSystem + 枚举
③ 填数据+导出 .../2-导出Blob → Assets/StreamingAssets/ConfigBlob/*.blob
④ 引导期注册 生成的 XxxBlobSystem(A1)TryRead → ConfigBlobTable.FromBlob → Register
⑤ 运行期读 门面 {ns}.ConfigManager.{Type}.GetByID(id)
⚠
导出落点只有一个真源:
ConfigDataSettings.BlobOutputDir(默认 Assets/StreamingAssets/ConfigBlob,必须位于 StreamingAssets 内)。运行期读取路径 BlobLoadPath 由它派生(剥掉前缀),不要手写两份路径;输出目录不在 StreamingAssets 内时导出会直接报错,别靠改加载路径绕过。这个示例怎么跑的
HYCSimpleConfigDemoSystem 把「第 4 步建表 + 注册」从数据文件加载了:运行期读 Resources/items.csv → ConfigBlobTable<HycSimpleItemRow>.Build(rows, index) → ConfigRegistry.Register。这样导入即跑、不依赖先跑生成器,且改数据只改 CSV。
// 读取发生在 System.OnCreate(建 World 时)——WebGL / Android 上 StreamingAssets 不能直接读文件,
// 预取必须在建 World 前完成:引导入口用 await FrameworkBootstrap.InitializeAsync("World")
// (内部先 await StreamingAssets.PreloadAsync())。PC / iOS 上同步/异步入口等价,同一套代码。
给 AI 的雷区
- 行结构体必须 blittable:
ConfigBlobTable<TRow> where TRow : unmanaged。含string/class字段会编译不过;文本一律用BlobString(生成器自动处理)。 - 查表靠 id 索引:
Build(rows, explicitIndex)的explicitIndex必须给出id→行序,否则TryGet(id)按行序 0..n-1 找,命中不到你想要的 id。 - 枚举字段在 Blob 里是
int:需(int)XxxKind.Red比较,且数值是 1 基(没有 0 值)。 - 查表是世界无关的:门面是静态调用,不要在系统里缓存 World 来查表;⛔ 也不要调低层
ConfigRegistry。 - 外部数据也要 blittable:从 CSV/Excel 读到的字段,最终必须映射成纯标量
TRow。本例 CSV 里的Name只给人看,行内不存文本。 - 🔴 跨端:自己手写加载逻辑时,读字节一律走
StreamingAssets.ReadBytes(相对路径),禁止File.ReadAllBytes(Application.streamingAssetsPath + …)。
验证清单
- 进 Play,Console 打印
[HYCSimple] 配置表加载:8 行,已注册到 ConfigRegistry。 - 改
Config/Resources/items.csv某行 Price 后重进 Play,日志里的 Price 随之变化(证明配置不在代码里写死)。 - 走真实链路:建模板 → 生成代码 → 导出 Blob → 引导期注册 → 门面命中。