Files
Fishdice/FishDice/Docs/Handoff/lucky-dice-assets-config-checklist.md
2026-06-23 16:11:06 +08:00

368 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lucky Dice 资产与配置交付清单
## 文档目的
这份清单用于对齐美术、策划和程序在 Lucky Dice 第一版中的交付边界:
- 美术同学需要提供哪些可落地资产。
- 策划同学需要提供哪些规则、权重和玩法入口配置。
- 程序当前 core 已经如何实现,接下来完整开发还需要哪些外部输入。
当前实现以 `LuckyDiceRollFlowService` 为核心入口Demo 表现层只做最小 UI 演示。也就是说core 骨架已经足够承接后续开发;接下来重点不是继续扩 demo core而是让美术和策划补齐完整表现、完整特殊结果、运营策略和目标短玩法内容。
## 当前玩法闭环
第一版核心链路如下:
```text
玩家触发普通 Roll
-> DiceRollService 生成普通骰子结果
-> ComboFactBuilder 生成组合事实
-> ComboRuleMatcher 按优先级命中组合规则
-> RollActionDispatcher 执行 action
-> 如果 action 触发 Lucky Dice
-> LuckyDiceFlowService 筛选候选并按权重随机
-> 生成 Lucky Dice 结果槽
-> TargetModeResolver 解析目标玩法模式
-> 输出 EnterTargetModeEffect 给表现层或目标玩法入口
```
当前默认结果:
| 场景 | 当前配置结果 |
| --- | --- |
| 数字 + 数字 | 普通奖励 |
| 数字 + clover | 普通奖励 + Clover bonus |
| clover + clover | 触发 Lucky Dice |
| Lucky Dice 选中 rocket | 进入 `slap_down_normal` |
| Lucky Dice 选中 thief | 进入 `treasure_heist_normal` |
## 美术资产清单
### 第一版必须提供
| 模块 | 资产 | 数量/规格 | 用途 | 命名建议 |
| --- | --- | --- | --- | --- |
| 普通骰子 | 数字骰面 | 5 个,数字 `2/3/4/5/6` | 普通 Roll 展示 | `dice_face_2``dice_face_6` |
| 普通骰子 | Clover 骰面 | 1 个 | 触发 bonus 或 Lucky Dice | `dice_face_clover` |
| Lucky Dice | Rocket 结果图标 | 1 个 | 表示进入 Slap Down | `lucky_result_rocket` |
| Lucky Dice | Thief 结果图标 | 1 个 | 表示进入 Treasure Heist | `lucky_result_thief` |
| Lucky Dice | 结果槽底板 | 1 套,可复用 3 格 | 当前显示 3 个相同结果槽 | `lucky_slot_frame` |
| UI | Lucky Dice 标题区 | 1 套 | 进入特殊流程时显示标题 | `lucky_title_panel` |
| UI | 倍率/奖励文案底板 | 1 套 | 显示倍率、奖励或结果反馈 | `lucky_reward_panel` |
| UI | 普通投骰按钮状态 | 至少 3 态 | 待投、投掷中、再投一次 | `btn_roll_normal/default/disabled` |
| UI | 特殊结果揭示状态 | 至少 1 套 | Lucky Dice 结果亮相 | `lucky_reveal_state` |
### 第一版建议提供
| 模块 | 资产 | 说明 |
| --- | --- | --- |
| 转场 | 普通 Roll 命中 Lucky Dice 的轻量转场 | 不需要复杂白烟或飞入,先提供短过渡即可 |
| 反馈 | Clover bonus 的小特效 | 用于区分数字 + clover 和普通奖励 |
| 反馈 | Lucky Dice 命中特殊结果的高亮 | 结果槽定格时使用 |
| 音效 | 普通骰子滚动音效 | 可先 1 个循环或短音 |
| 音效 | Lucky Dice 揭示音效 | 结果揭示时播放 |
| 音效 | 进入目标玩法音效 | `rocket/thief` 跳转前反馈 |
### 后续扩展预留
| 扩展方向 | 资产需求 |
| --- | --- |
| 新 Lucky Dice 结果 | `chest/bomb/key` 等图标、命中特效、入口反馈 |
| 结果槽数量变化 | 2 格、4 格或动态布局适配资源 |
| 更复杂动画 | 托盘、骰子飞入、粒子爆发、白烟转场、镜头震动 |
| 教程/Bonus 模式 | 教程标识、bonus 标识、特殊状态底板 |
| 目标玩法落地 | Slap Down、Treasure Heist 各自入口插画或短玩法 UI |
### 完整表现开发需要提供
这些不是当前 demo core 的必需项,但属于下一阶段完整开发前必须向美术收齐的输入。
| 模块 | 资产/说明 | 需要确认 |
| --- | --- | --- |
| 托盘动画 | Lucky Dice 托盘出现、停留、退出的完整动画 | 时长、入场方向、层级、是否可跳过 |
| 骰子飞入 | 普通骰或 Lucky Dice 结果飞入槽位的动画 | 起点、路径、缓动、落点反馈 |
| 白烟转场 | 命中 Lucky Dice 或进入目标玩法前的白烟/遮罩转场 | 遮挡范围、时长、是否承接场景切换 |
| 粒子爆发 | 命中特殊结果、Clover bonus、进入目标玩法的粒子 | 颜色、强度、触发节点 |
| 全套时序参考 | 竞品完整动画拆帧或时间轴 | 每段开始/结束点、可交互锁定时间 |
| 失败/兜底表现 | 候选池为空、目标模式缺失、普通奖励兜底的提示表现 | 是否展示给玩家、是否只进调试日志 |
## 策划配置清单
### 骰子集合配置
| 字段 | 当前值 | 说明 | 提供方 |
| --- | --- | --- | --- |
| `diceSetId` | `normal_main` | 普通骰子集合 ID | 策划 |
| `setType` | `Normal` | 普通骰子集合 | 程序固定枚举,策划确认 |
| `diceCount` | `2` | 普通 Roll 投几颗骰子 | 策划 |
| `faces` | `2,3,4,5,6,clover` | 普通骰面池 | 策划确认,美术提供图 |
| `diceSetId` | `lucky_dice` | Lucky Dice 集合 ID | 策划 |
| `setType` | `Lucky` | 特殊结果集合 | 程序固定枚举,策划确认 |
| `defaultResultSlotCount` | `3` | 特殊结果默认展示槽数 | 策划 |
| `faces` | `rocket,thief` | 第一版特殊结果池 | 策划确认,美术提供图 |
### 普通组合规则配置
| 字段 | 当前示例 | 说明 |
| --- | --- | --- |
| `ruleId` | `normal_clover_clover_lucky_dice` | 规则唯一 ID |
| `priority` | `100` | 优先级,高的先匹配 |
| `matcherType` | `ExactCombo` | 使用哪种匹配器 |
| `comboKey` | `clover_clover` | 精确组合 key |
| `actions` | `trigger_lucky_dice` | 命中后执行的行为 |
| `stopAfterMatched` | `true` | 命中后是否停止后续规则 |
当前默认规则:
| 优先级 | 规则 | 行为 |
| --- | --- | --- |
| 100 | `clover_clover` | `trigger_lucky_dice` |
| 50 | 包含 1 个 `clover` | `grant_reward` + `add_multiplier` |
| 10 | 全部是数字 | `grant_reward` |
策划新增组合时,优先新增规则配置;只有现有 matcher 无法表达时才需要程序新增 matcher。
### 可用 matcher 类型
| matcher | 可表达内容 |
| --- | --- |
| `ExactCombo` | 精确匹配无序或有序组合 key |
| `AllNumbers` | 所有骰子都是数字 |
| `ContainsFace` | 包含指定骰面 |
| `FaceCount` | 指定骰面数量等于某值 |
| `FaceCountRange` | 指定骰面数量在区间内 |
| `DiceCount` | 限定骰子数量 |
| `NumberPair` | 数字对子 |
| `NumberOfAKind` | N 个相同数字 |
| `NumberSumRange` | 数字点数和区间 |
### 可用 action 类型
| action | 当前效果 | 需要策划提供的参数 |
| --- | --- | --- |
| `grant_reward` | 产出普通奖励效果 | 后续需要接真实奖励时补奖励 ID、数量、倍率策略 |
| `add_multiplier` | 产出倍率效果 | 当前使用 `reason=clover_bonus` |
| `trigger_lucky_dice` | 进入 Lucky Dice 流程 | 无 |
规格中预留了 `enter_mode``show_popup`,但当前默认执行器尚未实现;如果策划需要直接进玩法或弹提示,需要先补程序执行器。
### Lucky Dice 候选配置
| 字段 | 当前示例 | 说明 |
| --- | --- | --- |
| `resultKey` | `rocket` | Lucky Dice 抽中的特殊结果 |
| `targetKey` | `slap_down` | 目标玩法 ID |
| `resultSlotCount` | `3` | 显示几个结果槽 |
| `weight` | `1` | 权重随机用 |
| `enabled` | `true` | 是否启用 |
| `minLevel` | `0` | 最低玩家等级 |
| `sourceFilter` | `normal_roll` | 允许从哪个来源触发 |
| `isDefault` | `true` | 候选池兜底结果 |
当前默认候选:
| resultKey | targetKey | modeKey | slot | weight | default |
| --- | --- | --- | --- | --- | --- |
| `rocket` | `slap_down` | `slap_down_normal` | 3 | 1 | 是 |
| `thief` | `treasure_heist` | `treasure_heist_normal` | 3 | 1 | 否 |
### 目标模式配置
| 字段 | 当前示例 | 说明 |
| --- | --- | --- |
| `resultKey` | `rocket` | Lucky Dice 特殊结果 |
| `targetKey` | `slap_down` | 目标玩法 |
| `modeKey` | `slap_down_normal` | 具体进入模式 |
后续如果要支持新手教程、bonus 模式或活动模式,建议新增 mode 配置与解析规则,不要把分支写进 Lucky Dice 随机逻辑里。
### 完整结果与短玩法内容配置
这些内容是下一阶段开发需要策划提供的核心输入。
| 内容 | 需要提供 | 说明 |
| --- | --- | --- |
| `chest` 完整玩法 | `resultKey``targetKey`、默认 `modeKey`、奖励规则、表现需求、失败/退出规则 | 当前 core 支持新增候选,但玩法语义需要策划定义 |
| `bomb` 完整玩法 | 触发条件、目标玩法、奖励或惩罚、是否影响倍率、表现需求 | 需要明确是否只是入口还是独立短玩法 |
| `key` 完整玩法 | 解锁对象、奖励池、目标玩法、与进度/关卡的关系 | 需要明确是否有库存、冷却或次数限制 |
| Slap Down 短玩法规则 | 入口条件、胜负条件、交互方式、奖励结算、退出回主循环规则 | 当前只解析到 `slap_down_normal`,未实现短玩法内容 |
| Treasure Heist 短玩法规则 | 入口条件、交互方式、奖励结算、失败处理、退出回主循环规则 | 当前只解析到 `treasure_heist_normal`,未实现短玩法内容 |
| 组合行为说明 | 每个普通骰组合对应的玩家可感知结果、奖励、倍率、提示、是否进入 Lucky Dice | 程序仍优先映射到通用 action只有出现新通用行为时才新增 executor |
### 复杂运营权重策略
当前 core 已有 `weight``enabled``minLevel``sourceFilter`,但复杂运营策略还需要策划补完整规则。
| 策略 | 需要提供 |
| --- | --- |
| 活动期权重 | 活动 ID、起止条件、哪些 `resultKey` 提权、权重变化值 |
| 新手期策略 | 第几次 Roll 固定结果、何时开放随机、教程模式如何映射 |
| 冷却策略 | 每个 `targetKey/resultKey` 的冷却时间、次数限制、跨局是否继承 |
| 保底策略 | 连续未命中特殊结果几次后提升概率或强制命中 |
| 互斥策略 | 哪些结果不能连续出现,哪些结果不能与当前关卡/活动共存 |
| 兜底策略 | 候选池为空、权重全 0、模式缺失时给玩家什么结果 |
### 兜底与验收配置
策划需要确认以下策略:
| 问题 | 当前程序行为 | 需要确认 |
| --- | --- | --- |
| 普通组合未命中 | 目前规则覆盖默认 2 骰主要组合 | 未命中时是否发普通奖励兜底 |
| Lucky Dice 候选过滤后为空 | 优先找过滤后 default没有则 `NormalRewardFallback` | 是否允许回普通奖励 |
| 候选权重都小于等于 0 | 不参与随机,走 default 或普通奖励兜底 | 是否需要配置校验直接报错 |
| 目标模式缺失 | 返回 `TargetModeFailedEffect` | 是否弹错误、发普通奖励或阻断 |
| 新增结果没有图标 | core 可出结果,但表现层无法正确展示 | 是否允许占位图 |
## 当前 core 实现说明
### 入口
`LuckyDiceRuntimeFactory.CreateDefaultFlow()` 创建默认运行时,注入:
- `DiceRollService`
- `ComboRuleMatcher`
- `RollActionDispatcher`
- `LuckyDiceFlowService`
- `TargetModeResolver`
外部只需要向 `LuckyDiceRollFlowService.Execute()` 传入 `RollFlowRequest`,就能得到完整 `RollFlowResult`
### 普通 Roll
`DiceRollService` 根据 `DiceSetConfig.DiceCount` 投掷,不写死两颗骰子。`ComboFactBuilder` 会把普通结果转成:
- 原始 faces
- `FaceCounts`
- `NumberValues`
- `NumberSum`
- `CloverCount`
- `NormalizedKey`
- `OrderedKey`
普通组合匹配只处理 `DiceSetType.Normal`。如果把 Lucky Dice 特殊结果交给 `ComboFactBuilder`,测试已经覆盖会拒绝处理。
### 规则匹配
`ComboRuleMatcher` 按优先级匹配规则matcher 由 `MatcherType` 注册。当前默认 matcher 已覆盖第一版和 N 骰扩展常用场景。
这意味着新增组合时通常只需要策划加配置,例如:
```text
FaceCountRange clover min 2 -> trigger_lucky_dice
NumberOfAKind count 3 -> grant_reward + add_multiplier
```
### 行为执行
`RollActionDispatcher` 只按 `ActionType` 找 executor不按 `clover_clover` 这类组合 key 找方法。
当前执行器只实现三类:
- `grant_reward`
- `add_multiplier`
- `trigger_lucky_dice`
如果未来要有弹窗、直接进玩法、发具体道具包,需要新增通用 executor而不是给每个组合写独立方法。
### Lucky Dice 选择
`LuckyDiceFlowService.Select()` 当前做了三层筛选:
1. `enabled`
2. `playerLevel >= minLevel`
3. `sourceFilter` 包含当前 `TriggerSource`
筛选后按 `weight` 做随机。若没有可随机候选,会尝试 filtered 里的 `isDefault`;仍没有时返回普通奖励兜底标记 `NormalRewardFallback`
当前实现还没有独立的 cooldown/tutorial filter 类,字段和规格已预留,后续要做时应在这里扩展筛选链。
### 结果槽
Lucky Dice 随机只选一个 `resultKey`。展示槽由配置生成:
```text
slotCount = candidate.resultSlotCount
?? luckyDiceSet.defaultResultSlotCount
?? 3
```
第一版会把同一个 `resultKey` 重复填满槽位,例如 `rocket, rocket, rocket`
### 目标模式解析
`TargetModeResolver``resultKey + targetKey``TargetModeConfig`,得到最终 `modeKey`
当前默认映射:
- `rocket + slap_down -> slap_down_normal`
- `thief + treasure_heist -> treasure_heist_normal`
如果映射缺失,会返回 `MissingTargetMode`,不会静默吞掉。
### 表现层
`LuckyDiceDemoController` 是当前最小表现 demo
- 运行时创建 Canvas。
- 展示 2 个普通骰子文本。
- 命中 Lucky Dice 时展示 3 个特殊结果槽。
- 根据 `LuckyDiceDemoSnapshot` 显示组合、规则、效果和目标模式。
它现在使用文字模拟骰面和结果,尚未接入正式图片、动画、音效或目标玩法真实场景。
## 给美术和策划的交付格式建议
### 美术交付建议
```text
Art/LuckyDice/
DiceFaces/
dice_face_2.png
dice_face_3.png
dice_face_4.png
dice_face_5.png
dice_face_6.png
dice_face_clover.png
LuckyResults/
lucky_result_rocket.png
lucky_result_thief.png
UI/
lucky_slot_frame.png
lucky_title_panel.png
lucky_reward_panel.png
VFX/
vfx_clover_bonus.prefab
vfx_lucky_reveal.prefab
Audio/
sfx_dice_roll.wav
sfx_lucky_reveal.wav
sfx_target_enter.wav
```
### 策划配置表建议
第一版建议拆成 4 张表或 4 个 JSON/ScriptableObject
| 表 | 主键 | 内容 |
| --- | --- | --- |
| `DiceSetConfig` | `diceSetId` | 骰子集合、数量、面池、默认槽数 |
| `ComboRuleConfig` | `ruleId` | 普通组合规则、优先级、matcher、actions |
| `LuckyDiceCandidateConfig` | `resultKey + targetKey` | Lucky Dice 候选、权重、启用条件、槽数 |
| `TargetModeConfig` | `resultKey + targetKey` | 目标玩法模式映射 |
程序当前已经有这些结构的本地默认版本;后续可以把默认硬编码迁移到 ScriptableObject 或 JSON。
## 下一阶段需要收齐
当前 demo core 已经足够验证基础链路。下一阶段如果要进入完整开发,需要美术和策划补齐以下内容:
- 完整复刻竞品的托盘、飞入、白烟、粒子爆发全套动画拆解与资源。
- `chest/bomb/key` 的完整玩法内容、入口配置、奖励结算和表现需求。
- 复杂运营权重策略,包括活动期、新手期、冷却、保底、互斥和兜底。
- Slap Down / Treasure Heist 的完整短玩法规则,而不仅是 `modeKey`
- 每个普通骰组合的行为需求说明,包括奖励、倍率、提示、是否触发 Lucky Dice。
程序侧当前不建议为每个组合直接新增独立方法;策划需要提供的是“组合对应的玩法意图和参数”。程序会优先把这些意图配置到现有 matcher/action 体系中,只有现有通用 action 无法表达时,才新增新的通用 executor。