你遇到的错误是因为 Mermaid 的 mindmap 语法对缩进和节点格式非常严格,不能混用多级节点和行内注释(例如 - xxx() 这样),它认为你写的是“节点描述”,但你直接写了“代码或函数名”。
✅ 解决方案一:用纯“节点名称”格式写,不加 - 和 (),避免语法错误
我已修复语法错误并重新格式化结构,下面的代码可直接在 https://mermaid.live/ 中运行,也可以在 Obsidian 和 VSCode Mermaid 插件中预览。
✅ 正确可运行的 Mermaid Mindmap(修复版)
mindmap root((Ingredient System)) IngredientDef FluidDef Material AudioType ItemDef MaxStack Mesh Material Scale (In Prefab) Stack ItemStack def: ItemDef amount: int IsEmpty CanMerge Merge FluidStack def: FluidDef volume: float IsEmpty CanMerge Merge Storage ItemStorage List<ItemStack> Insert Extract View FluidStorage List<FluidStack> List<float> Fill Drain View Interface IngredientStack GetAbstractDef IStackable CanMerge Merge IItemStorage Insert Extract View IFluidStorage Fill Drain View IFluidContainer Capacity CurrentFluid Fill Drain CanAccept
✅ 可视化效果预览
你可以将以上代码粘贴到以下任一环境中查看:
| 工具 | 用法 |
|---|---|
| mermaid.live | 直接粘贴代码后点击「Render」按钮 |
| Obsidian | 在 .md 文件中粘贴代码块,切换到阅读模式 |
| VSCode | 安装插件 Markdown Preview Mermaid Support 后预览 |
❓是否需要带图标 / 颜色 / 样式?
Mermaid mindmap 也支持给每个节点加上:
-
图标(用 emoji)
-
背景颜色、字体颜色
-
例如:
mindmap root((🌱 Ingredient 系统)) Stack ItemStack 🎁 📦 amount 🧪 CanMerge
如果你需要更美观/结构复杂的版本,我可以给你拓展为更完整的分层样式。
要不要我再帮你导出成 PNG 图像版本供插图用?
flowchart TD %% ────────────── Cauldron MonoBehaviour Layer ────────────── subgraph MonoBehaviourLayer [MonoBehaviour Layer] direction TB SolidIn([Solid Enter]) SolidReceiver[CauldronSolidReceiver<br/>OnTriggerEnter] ReceiveSolid[CauldronObject.ReceiveSolid] LiquidIn([Fluid Enter]) LiquidReceiver[CauldronLiquidReceiver<br/>ReceiveLiquid] ReceiveLiquid[CauldronObject.ReceiveLiquid] ContainerIn([Container Enter]) ScoopReceiver[CauldronScoopReceiver<br/>OnTriggerEnter] TryScoop[CauldronObject.TryScoopLiquid] AfterInsert[CauldronObject.AfterInsert] SpawnSolid([Instantiate Physical Object]) UpdatePlane([Liquid Layer Update]) ExplodeFX([HandleExplosion Visual FX]) end %% ────────────── Cauldron Data Layer ────────────── subgraph DataLayer [Data Layer] direction TB InsertSolid[data.InsertSolid] InsertLiquid[data.InsertLiquid] TakeFluid[data.TakeFluid] TryProcess[data.TryProcessOnce] MatchRecipe[MatchRecipe<br/>+ ExplosionCurve] SpawnList[[Spawn<br/>Solids / Liquids]] OnInvChanged((OnInventoryChanged Event)) OnExplode((OnExplode Event)) end %% ────────────── Connection ────────────── SolidIn --> SolidReceiver --> ReceiveSolid --> InsertSolid LiquidIn --> LiquidReceiver --> ReceiveLiquid --> InsertLiquid ContainerIn --> ScoopReceiver --> TryScoop --> TakeFluid InsertSolid --> OnInvChanged InsertLiquid --> OnInvChanged InsertSolid --> AfterInsert InsertLiquid --> AfterInsert AfterInsert --> TryProcess TryProcess --> MatchRecipe MatchRecipe --> SpawnList SpawnList --> SpawnSolid SpawnList --> UpdatePlane MatchRecipe --> OnExplode OnExplode --> ExplodeFX AfterInsert --|Exceeds max capacity|--> ExplodeFX