# FishDice 流程与生命周期

← 返回总览 流程与生命周期

# 一次 Roll 的完整生命周期

框架生命周期不是 Unity 场景级生命周期，而是玩法请求级生命周期：一次 `RollFlowRequest` 进入核心服务，沿着 Roll、Facts、Rules、Actions、LuckySelection、TargetMode 和 Trace 形成闭环。

## 主链路

    RollFlowRequest
      -> DiceRollService.Roll
      -> ComboFactBuilder.Build
      -> ComboRuleMatcher.Match
      -> RollActionDispatcher.Execute
      -> LuckyDiceFlowService.Select       [只有触发 Lucky Dice 时]
      -> TargetModeResolver.Resolve        [只有选中 Lucky Dice 候选时]
      -> RollFlowResult + RollTrace

`LuckyDiceRollFlowService.Execute` 是整个核心生命周期的编排点。它创建 `RollTrace`，执行普通骰子 Roll，把结果转成组合事实，再匹配规则和分发 action。如果 action 结果中包含 `LuckyDiceRequestedEffect`，才进入 Lucky Dice 选择和目标玩法解析。

## 生命周期所有权

阶段 | 所有者 | 输入 | 输出
--- | --- | --- | ---
请求校验 | `LuckyDiceRollFlowService` | `RollFlowRequest` | 有效 session、dice set、trigger source。
骰子产生 | `DiceRollService` | `DiceSetConfig`、随机源 | `DiceRollResult`。
事实提取 | `ComboFactBuilder` | 普通骰子结果 | `ComboFacts`，含无序 key、计数、点数。
规则命中 | `ComboRuleMatcher` | facts、combo rules | 按优先级排列的 `ComboRuleMatch`。
行为执行 | `RollActionDispatcher` | action list、context | `RewardEffect`、`MultiplierEffect`、`LuckyDiceRequestedEffect` 等。
特殊骰子选择 | `LuckyDiceFlowService` | 候选池、请求上下文、Lucky Dice set | 选中候选、slot count、fallback 类型。
目标玩法解析 | `TargetModeResolver` | 选中候选、请求、倍率、mode definitions | `TargetModeEntry` 或失败原因。

## Unity Demo 生命周期

Demo 层通过 `LuckyDiceDemoController.Awake` 构建 UI 并显示初始状态。用户点击按钮后，`StartRoll` 启动 coroutine，先做普通骰子动画，再调用 `LuckyDiceDemoRunner.RunRandom` 获取核心结果，并根据结果展示普通奖励、Clover Bonus 或 Lucky Dice 目标玩法。

这里的 UI 动画不是核心生命周期的一部分。核心已经在 `RunRandom` 调用时一次性算完，UI 只是消费结果并播放表现。

## 可观测生命周期

`RollTrace` 贯穿同一个 `RollSessionId`，记录普通骰面、组合 key、命中规则、执行 action、Lucky Dice 候选数量、随机值、选中结果、解析出的模式和最终 outcome。这是定位“为什么进了某个玩法”的主线。

## 证据

- LuckyDiceRollFlowService.cs:32-103：一次 Roll 的完整编排。
- LuckyDiceFlowService.cs:16-49：Lucky Dice 候选筛选、权重随机、兜底和 slot count。
- TargetModeResolver.cs:9-33：选中结果到目标玩法模式的映射。
- RollTrace.cs:43-115：生命周期关键字段记录。
- LuckyDiceDemoController.cs:30-74：Demo 的 Awake、StartRoll、PlayRollFlow。