宏观看 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 引用。