# FishDice 结构与分层

← 返回总览 结构与分层

# 宏观看 FishDice 的结构和分层

当前框架把真正的玩法决策放在 `Runtime/LuckyDice`，把 Unity 场景、按钮、Canvas、Editor 菜单和演示逻辑隔离在 Demo 层。这是非常明确的“核心域模型先行”结构。

## 目录分层

层级 | 位置 | 职责 | 依赖判断
--- | --- | --- | ---
Runtime 核心 | Assets/FishDice/Runtime/LuckyDice | 骰子配置、Roll、组合事实、规则、Action、Lucky Dice 候选、TargetMode、Trace。 | 纯 C#，asmdef 不引用 UnityEngine。
Demo 表现 | Assets/FishDice/Demo | 运行核心流程，格式化结果，构建一个可交互 UGUI 演示。 | 引用 `FishDice.Runtime` 和 `UnityEngine.UI`。
DemoEditor | Assets/FishDice/DemoEditor | 通过菜单创建 LuckyDiceDemo 场景，并加入 Build Settings。 | 依赖 UnityEditor，只服务编辑器构建。
Tests | Assets/FishDice/Tests/EditMode/LuckyDice | 验证核心链路、配置校验、扩展注册、Demo 输出。 | 用固定随机源验证可回放行为。
Docs | Docs | 需求、规格、ADR、架构蓝图和资源交接资料。 | 当前实现与文档目标大体一致，但以源码为准。

## 核心内部切分

Data
只放不可变或近似不可变的数据结构：`DiceFace`、`DiceRollResult`、`ComboFacts`、`RollFlowResult`、各种 Effect。
Config
默认配置、配置定义行、定义加载、配置校验和错误类型。
Services
`DiceRollService` 和 `ComboFactBuilder` 处理基础 Roll 与事实提取。
Rules
`ComboRuleMatcher` 按优先级和 MatcherType 匹配规则。
Actions
`RollActionDispatcher` 按 ActionType 分发，避免组合 key 直接绑定方法。
LuckySelection
`LuckyDiceFlowService` 筛选候选、权重随机、兜底和结果槽数量。
TargetMode
`TargetModeResolver` 把选中的 Lucky Dice 结果映射到具体目标玩法模式。

## 依赖方向

依赖方向基本是单向的：Demo 依赖 Runtime，Runtime 内部由 `LuckyDiceRollFlowService` 编排各个小服务。核心服务只接收结构化输入并返回结构化结果，不调用场景、Canvas、Prefab 或 MonoBehaviour。

这意味着核心玩法可以在 EditMode 测试中直接运行，不需要打开 Unity 场景，也不需要模拟 UI 动画。

## 证据

- FishDice.Runtime.asmdef:13：Runtime 设置 `noEngineReferences: true`。
- FishDice.Demo.asmdef:7-16：Demo 引用 `FishDice.Runtime` 与 `UnityEngine.UI`。
- LuckyDiceRuntimeFactory.cs:51-58：RuntimeFactory 装配 Roll、Rule、Action、LuckySelection、TargetMode。
- LuckyDiceCoreFlowTests.cs:512-516：测试显式断言 Runtime asmdef 禁止 Engine 引用。