设置扩展
This commit is contained in:
@@ -60,7 +60,7 @@
|
||||
| UI/UX | 35–50% | Yellow | 已有完整视觉方向和主要页面;响应式、Safe Area、可访问性、占位文本与统一规范未完成 |
|
||||
| Settings / Input | 35–50% | Red | 音量、帧率、Render Scale、Offset、语言、Rebind 已有;存在逻辑缺口与移动端风险 |
|
||||
| 剧情系统与文本 | 20–35% | Red | Yarn/Presenter/Portrait/Save 框架存在;目前只有少量原型文本和不完整 StoryData |
|
||||
| Localization | 10–25% | Red | 同时使用 I2 与 Unity Localization;源语言配置冲突,多数 Locale 空缺 |
|
||||
| Localization | 10–25% | Red | 已决策以 Unity Localization 作为唯一正式管线;需迁移既有本地化资源、解除旧系统依赖,并补齐多数 Locale |
|
||||
| Creator 内容管线 | 不纳入本轮 | Gray | 仅在 Official 出现共享数据或导入/导出关联证据时重新纳入 |
|
||||
| QA / Automation | 0–10% | Red | 未发现项目自有自动化测试、Test asmdef、CI 或正式回归证据体系 |
|
||||
| Build / Release Engineering | 5–15% | Red | 缺少可复现 Build Profile、CI、版本/渠道矩阵、发布候选流程和回滚方案 |
|
||||
@@ -89,13 +89,13 @@
|
||||
### P1:阻止 Feature Complete / Beta
|
||||
|
||||
1. Offline 内容解锁已统一为独立 `UnlockSaveModule`;仍需补齐新档、授予 Key、重启读取与所有入口拦截的 Unity 端到端证据。
|
||||
2. Settings 加载未应用语言;I2 与 Unity Localization 依赖相同 Index 顺序,容易错配。
|
||||
2. Settings 的语言存档仍为 Index;迁移到 Unity Localization 后应改为稳定 Locale ID,避免 Locale 列表排序造成错配。
|
||||
3. Rebind 使用 `Rebinds` 保存,但 Reset 查询/删除 `Rebind`,无法正确恢复默认值。
|
||||
4. `KeyRebindButton` 在找不到 Action 的异常路径中可能不恢复 Input 与 Waiting Cover。
|
||||
5. Input Actions 缺少完整的 Submit/Back/Controller 导航与 Control Scheme;未发现 `EnhancedTouchSupport.Enable()`,移动端触控需实机验证。
|
||||
6. UI Scene 内混用 `1920×1080`、`2560×1440` 和 Constant Pixel Size;未发现 `Screen.safeArea` 适配。
|
||||
7. Scene 中仍存在大量测试值、硬编码中英文、`114514`、`Choice 0`、Test 文案等候选占位内容。
|
||||
8. Localization 资产不完整:I2 54 个 Term 中多个语言缺失,且有 5 个引用 Term 与资源命名不一致;Unity UI Table 只有 7 个 Key,除 `en`/`zh-CN` 外其余表为空;Message Table 为空。
|
||||
8. Localization 资产不完整:Unity UI Table 只有 7 个 Key,除 `en`/`zh-CN` 外其余表为空;Message Table 为空。迁移期间还需完成旧本地化资产清点、替换与删除验证。
|
||||
9. `StreamingAssets` 同时包含 Android、iOS、Windows64 ThemeBundle,可能让各平台 Build 携带无关资源。
|
||||
10. Runtime `Assets` 中保存了大量 PSD、整屏 Mockup 和 120 帧 Loading PNG;需在不破坏引用的前提下分离 Source Art 与 Runtime Export。
|
||||
|
||||
@@ -212,13 +212,13 @@ Exit Criteria:首发观察窗口结束,严重问题关闭或已部署修复
|
||||
| STORY-002 | P0 | Official | 决定 Yarn 真正 Source Language 并修正 Yarn Project/Table | M | DEC-003 | TODO | Locale Contract |
|
||||
| STORY-003 | P0 | Official | 完成首发剧情、角色表、Portrait、Command 与分支条件 | L | REL-002, STORY-002 | TODO | Story Content Audit |
|
||||
| STORY-004 | P1 | Official | 移除 `Test Title` 等原型命令,补充缺失内容验证器 | M | STORY-003 | TODO | Zero-placeholder Report |
|
||||
| LOC-001 | P0 | Official | 选择 I2/Unity Localization 的职责边界或迁移方案,禁止同 Index 隐式绑定 | L | STORY-002 | TODO | Localization ADR |
|
||||
| LOC-001 | P0 | Official | 执行 Unity Localization 单一管线迁移:建立 Locale ID 契约、替换旧运行时依赖并验证移除 | L | STORY-002 | TODO | Localization Migration ADR + Runtime Proof |
|
||||
| LOC-002 | P0 | Official | 建立单一 Key Manifest、术语表、Source/Target Locale 规则 | M | LOC-001 | TODO | Key Manifest |
|
||||
| LOC-003 | P0 | Official | 修复 5 个缺失 I2 Term 引用和现有空翻译 | S | LOC-002 | TODO | Automated Coverage Report |
|
||||
| LOC-003 | P0 | Official | 完成旧本地化资源迁移/移除,并修复 Unity String Table 中的空翻译与缺失引用 | S | LOC-002 | TODO | Automated Coverage Report |
|
||||
| LOC-004 | P0 | Official | 完成首发语言 100% Key 覆盖并锁定文本 | L | DEC-003, LOC-002 | TODO | Locale Coverage = 100% |
|
||||
| LOC-005 | P1 | Official | 配置 TMP Font/Fallback 并完成溢出、断行、RTL(如适用)和 LQA | L | LOC-004 | TODO | Screenshot Matrix |
|
||||
| SET-001 | P0 | Official | 修复 `Rebinds` / `Rebind` Reset Key 错配 | S | — | TODO | Automated Save Test |
|
||||
| SET-002 | P0 | Official | Settings Load 时应用语言,并验证 Locale 顺序不再隐式耦合 | M | LOC-001 | TODO | Restart Test |
|
||||
| SET-002 | P0 | Official | Settings Load 时以 Unity Localization Locale ID 应用语言,并验证 Locale 顺序不再隐式耦合 | M | LOC-001 | TODO | Restart Test |
|
||||
| SET-003 | P1 | Official | 修复 Rebind 异常退出,补 Submit/Back/Controller/Control Scheme | M | — | TODO | Input Matrix |
|
||||
| SET-004 | P1 | Official | 移动端启用/验证 Enhanced Touch、触控取消与多点触控 | M | DEC-001 | TODO | Device Test |
|
||||
| SET-005 | P1 | Official | 增加 Settings Version、Validation、Migration、Atomic Save 与 Reset All | L | — | TODO | Migration Tests |
|
||||
@@ -301,7 +301,7 @@ Exit Criteria:首发观察窗口结束,严重问题关闭或已部署修复
|
||||
| Song/Tutorial Story 节点为占位 | `Assets/Scripts/NewStorySystem/Tree/SongBlockView.cs`、`TutorialBlockView.cs` |
|
||||
| Chapter 0 引用未定义 `B-2` | `Assets/Story/Chapter0/StoryData_Chapter0.asset` |
|
||||
| Yarn 与 Story Localization 配置冲突 | `Assets/Story/Chapter0/Chapter0.yarnproject`、`Assets/Localization/Story/` |
|
||||
| I2 Term 覆盖与命名缺口 | `Assets/Resources/I2Languages.asset` |
|
||||
| 旧本地化资源覆盖与命名缺口 | `Assets/Localization/`、既有本地化资源目录 |
|
||||
| Rebind Reset Key 错配 | `Assets/Scripts/UI/Settings/RebindingWindow.cs` |
|
||||
| Login 被绕过、Localhost API 与 SDK 禁用 | `Assets/Scripts/UI/StartPage/StartUIPage.cs`、`Assets/Scripts/Online/` |
|
||||
| UI 缩放策略混合 | `Assets/Scenes/MenuScene.unity`、`Assets/Scenes/GameScene.unity` |
|
||||
|
||||
@@ -6,10 +6,10 @@ TutorialBlock 点击后通过通用 `SelectionBox` 动态生成“游玩教程 /
|
||||
|
||||
1. 将 TutorialBlock 的 `tutorialProgressVariable` 写为 `true`。
|
||||
2. 保存全局剧情变量。
|
||||
3. 将该 TutorialBlock 标记为 Completed,用于故事树的节点外观和防止重复点击。
|
||||
3. 将该 TutorialBlock 标记为 Completed,用于故事树的节点外观;Completed 状态仍允许玩家再次点击回顾教程。
|
||||
4. 重新计算所有 StoryBlock 的 `UnlockCondition`。
|
||||
|
||||
后续 Block 必须通过 `VariableCondition` 读取教程变量解锁,不要依赖 TutorialBlock 的完成记录。选择“游玩教程”后会进入 GameScene;选择“跳过教程”则留在故事树。教程游玩中退出、失败或关闭游戏不会回退已经确认的解锁状态。
|
||||
后续 Block 必须通过 `VariableCondition` 读取教程变量解锁,不要依赖 TutorialBlock 的完成记录。选择“游玩教程”后会进入 GameScene;选择“跳过教程”则留在故事树。教程游玩中退出、失败或关闭游戏不会回退已经确认的解锁状态。教程节点完成后仍可再次点击;重复游玩只会重写相同的已处理状态,不会影响已解锁的后续剧情。
|
||||
|
||||
## 运行时职责
|
||||
|
||||
@@ -17,7 +17,7 @@ TutorialBlock 点击后通过通用 `SelectionBox` 动态生成“游玩教程 /
|
||||
|---|---|
|
||||
| `StoryProgress` | 统一执行“写变量、保存、刷新故事树”;`ResolveTutorial` 同时更新教程节点完成状态。 |
|
||||
| `TutorialFlowController` | 验证 TutorialBlock 配置,并临时组装教程所需的两个 `SelectionBoxOption`。 |
|
||||
| `SelectionBoxUIPage` | 通用多选弹窗页面:动态生成一个 `SelectionBox`,阻断底层输入并在选择后销毁该实例。 |
|
||||
| `MessageUIPage` | MessageBox 与 SelectionBox 共用的弹窗页面:使用同一遮罩、容器和 FIFO 队列,动态生成并依次显示弹窗。 |
|
||||
| `SelectionBox` / `SelectionBoxButton` | 动态生成任意数量的选项按钮并确保一次显示只执行一个回调。 |
|
||||
| `TutorialCollection` | 用 `tutorialKey` 查询教程曲目的 `SongItemData`。 |
|
||||
| `InformationTransistor` | 用 `MenuReturnDestination` 保存唯一的返回目标,替代旧的两个返回 bool。 |
|
||||
@@ -78,12 +78,27 @@ TutorialBlock 不再需要专属弹窗。只需配置一套可供其它系统复
|
||||
|
||||
1. 创建一个 `SelectionBoxButton` Prefab:根节点具有 `Button` 与 `SelectionBoxButton`,子节点具有 `TMP_Text`。将 Button 和文本分别赋给 `button`、`labelText`。
|
||||
2. 创建一个 `SelectionBox` Prefab:根节点具有 `CanvasGroup` 与 `SelectionBox`;配置标题 `TMP_Text`、可选内容 `TMP_Text`、选项容器 `RectTransform`,并把上一步 Prefab 赋给 `optionButtonPrefab`。
|
||||
3. 在 `Assets/Scenes/MenuScene.unity` 创建一个全屏覆盖页:根节点具有 `CanvasGroup` 和 `SelectionBoxUIPage`,初始建议 `alpha = 0`、`interactable = false`、`blocksRaycasts = false`。
|
||||
4. 在该覆盖页下创建 `selectionBoxContainer`,并将它赋给 `SelectionBoxUIPage.selectionBoxContainer`;将上一步的 `SelectionBox` Prefab 赋给 `selectionBoxPrefab`。
|
||||
5. 选中 `MenuManager`,把该 `SelectionBoxUIPage` 组件拖入新的 `selectionBoxUIPage` 字段。
|
||||
3. 打开 `Assets/Scenes/MenuScene.unity` 中现有的 `MessagePage`。该节点已有 `CanvasGroup` 与 `MessageUIPage`,无需创建新的全屏覆盖页或在 `MenuManager` 新增引用。
|
||||
4. 将上一步的 `SelectionBox` Prefab 赋给 `MessageUIPage.defaultSelectionBoxPrefab`。它会与现有 `MessageBox` 共用 `messageContainer`。
|
||||
|
||||
教程点击时会运行时生成一个 SelectionBox,并生成两个按钮:`游玩教程` 与 `跳过教程`。未来其它非 Yarn 的交互(例如奖励二选一、离开确认、章节分支)可以传入自己的标题、内容和 `SelectionBoxOption` 列表复用这套 UI。按钮正式本地化留待剧情文本与本地化阶段处理。
|
||||
|
||||
### 4. 推荐按钮排版(SelectionBox 宽度 1200)
|
||||
|
||||
建议所有 2~3 个选项统一使用纵向等宽排列,而不是根据数量切换横向布局。这样在英文、日文、韩文和越南文的按钮文字长度不同时,仍有稳定的触控面积和视觉节奏。
|
||||
|
||||
| 配置项 | 推荐值 |
|
||||
|---|---|
|
||||
| `optionContainer` | `VerticalLayoutGroup` |
|
||||
| 左右 Padding | 72 |
|
||||
| 上下 Padding | 48 |
|
||||
| 按钮间距 | 24 |
|
||||
| 按钮高度 | 112(通过 Button Prefab 的 `LayoutElement.preferredHeight`) |
|
||||
| 按钮宽度 | 填满可用宽度,约 1056 |
|
||||
| 对齐方式 | `Middle Center` |
|
||||
|
||||
两按钮时,选项区高度约为 248;三按钮时约为 384,均适合固定宽度 1200 的弹窗。若存在“取消 / 返回”一类非主要操作,应固定放在最后一项,并以较弱的颜色或描边区分,不要仅通过位置变化表达危险性。横向三等分在 1200 宽度下每项只有约 336 宽,对越南文和未来较长的本地化文本余量不足,因此不建议作为通用 SelectionBox 的默认布局。
|
||||
|
||||
## 验证清单
|
||||
|
||||
1. 使用新存档或 StoryTree 的 `DebugResetChapterProgress` 重置 Chapter 0;该调试重置现在也会清除本章节的教程变量。
|
||||
@@ -92,9 +107,10 @@ TutorialBlock 不再需要专属弹窗。只需配置一套可供其它系统复
|
||||
4. 重置后选择“游玩教程”:确认进入 Chapter 0 Tutorial 的指定难度,且 `A-0` 在确认按钮点击后已解锁。
|
||||
5. 在教程暂停页或结算页返回菜单:应回到 Chapter 0 的 StoryPage,而不是 SongSelection 页面。
|
||||
6. 通过普通选曲进入歌曲后返回菜单:应仍回到 SongSelection 页面,且歌曲/难度缓存不受影响。
|
||||
7. 在 TutorialBlock 已完成后再次点击它:应再次显示 SelectionBox,选择“游玩教程”后能够重新进入教程,且后续剧情解锁状态不变化。
|
||||
|
||||
## 配置错误的表现
|
||||
|
||||
以下任一配置缺失时,TutorialBlock 会输出警告且不会解锁后续剧情:`tutorialKey`、`tutorialProgressVariable`、`tutorialDifficultySaveId`、TutorialCollection 中的曲目、可用的目标难度、`SelectionBoxUIPage` 引用、SelectionBox Prefab 或选项按钮 Prefab。
|
||||
以下任一配置缺失时,TutorialBlock 会输出警告且不会解锁后续剧情:`tutorialKey`、`tutorialProgressVariable`、`tutorialDifficultySaveId`、TutorialCollection 中的曲目、可用的目标难度、场景中的 `MessageUIPage`、`defaultSelectionBoxPrefab` 或选项按钮 Prefab。
|
||||
|
||||
这是一项运行时保护;本阶段不增加导入器或 Editor 阶段的额外防呆校验。
|
||||
|
||||
Reference in New Issue
Block a user