你遇到的错误是因为 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