# 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。