docs(huoshan): 添加销售视图动画和流程图文档

This commit is contained in:
2026-02-26 17:15:45 +08:00
parent c04be62288
commit 9076c11dba
2 changed files with 396 additions and 0 deletions
@@ -0,0 +1,80 @@
# SaleView 进入动画配置指南
## 一、层级结构说明
SaleViewSellView)下主要结构:
```
SellView
└── 步进模式
├── 轨道底座A ~ 轨道底座H (轨道底座组,共 8 个)
├── 内环
├── 外边框
├── 滑片c (滑片,需切换帧 a/b/c)
├── 电夹 (夹片,需 fadein
└── 其他(发条、线圈等)
```
## 二、实现方式:AnimClip + Animator Controller
### 1. 创建 Animator 与脚本
1.`步进模式` GameObject 上添加 `Animator` 组件(若无)
2. 添加 `SaleViewEnterAnimation` 脚本
3. 将步进模式设为默认**初始状态**(缩起、夹片透明等)
### 2. 创建 Animation ClipSaleViewEnter.anim
`Assets/Animation/HuoShan/` 下创建 `SaleViewEnter.anim`,绑定到 `步进模式`,添加如下曲线:
| 目标路径 | 属性 | 初始(0s) | 结束(0.6s) | 说明 |
|----------|------|----------|-------------|------|
| 轨道底座A ~ H | Transform.localScale | (0.3,0.3,1) | (1,1,1) | 轨道底座伸张 |
| 内环 | Transform.localScale | (0.5,0.5,1) | (1,1,1) | 内环放大 |
| 外边框 | Transform.localScale | (0.5,0.5,1) | (1,1,1) | 外边框放大 |
| 滑片c | SpriteRenderer.sprite | 滑片c 的 Sprite | 滑片a 的 Sprite | 帧切换 c→b→a |
| 电夹 | SpriteRenderer.color.a | 0 | 1 | 夹片淡入 |
**滑片帧动画**:在 0s 使用滑片c Sprite0.3s 使用滑片b0.6s 使用滑片a(若资源有 a、b、c 三帧)。
### 3. 创建 Animator ControllerSaleViewEnter.controller
1. 创建 `SaleViewEnter.controller`
2. 添加 **Bool** 参数:`Enter`(或 **Trigger**`Enter`
3. 添加两个状态:
- **Idle**:默认状态,绑定一帧保持“缩起”的 clip(或空 clip)
- **Enter**:绑定 `SaleViewEnter.anim`
4. 默认状态设为 **Idle**
5. 添加 Transition`Entry → Idle``Idle → Enter` 条件为 `Enter` Trigger`Enter → Idle` 勾选 “Has Exit Time”
### 4. 挂接到 SalesManager
1.`SaleViewEnter.controller` 赋给 `步进模式` 的 Animator
2.`SaleViewEnterAnimation``animatorController` 中引用该 Controller(可选,脚本会使用 Animator 上已有的)
3. `SalesManager.OpenView()` 会自动调用 `SaleViewEnterAnimation.PlayEnterAnimation()`
## 三、轨道底座组的两种做法
**方式 A:分别动画 8 个轨道底座**
每个 `轨道底座A` ~ `轨道底座H` 各做一条 `localScale` 曲线,从 (0.3,0.3,1) 到 (1,1,1)。
**方式 B:建父节点统一缩放**
1. 创建空 GameObject `轨道底座组`
2. 将 轨道底座A~H 拖为其子对象
3. 只对 `轨道底座组``localScale` 动画
## 四、夹片(电夹)淡入
- 使用 `SpriteRenderer.color` 的 alpha 通道
- 0salpha=0(透明)
- 0.6salpha=1(不透明)
若夹片有多个(如电阻圈、线圈等),可分别做 alpha 曲线。
## 五、默认保持初始状态
- Animator 默认进入 **Idle** 状态
- `SaleViewEnterAnimation.OnEnable()` 会执行 `Rebind()`,确保每次显示时从缩起状态开始
- 进入销售系统时调用 `PlayEnterAnimation()` 播放进入动画
+316
View File
@@ -0,0 +1,316 @@
# Test_Huoshan Yarn 完整流程图(Debug 用)
> 基于 `Test_Huoshan.yarnproject` 及所有 `.yarn` 文件生成
## 0. Yarn Graph 布局说明
节点已按逻辑分组,position 与 tags 便于在 Yarn Editor 中浏览:
| 区域 | X 范围 | 内容 |
|------|--------|------|
| 核心枢纽 | 300 | Start → VarsInit → Center(竖直) |
| Stage1 | 100 | 诊室开场(左列) |
| Stage2 主流程 | 150-450 | 检查表达→滤波器→情绪(中) |
| Stage2 分支 | 50-650 | 检查记忆/逻辑/视觉(插线入口上方) |
| 插线桥接 | 50-650, y=600 | Emo/Speak/Logic/Color/Memory/EyePlugIn |
| Stage3 销售 | 100-350 | 步进→转动完成→安装日志→旋钮(左中) |
| 销售桥接 | 550 | 销售模块转动完成、处理器单次调节失败 |
| Stage4-8 | 500 | 各 Stage 入口与结束(右列竖直) |
| 波形工具 | 700 | 波形_* 节点(最右) |
**colorID 含义:** 1=入口, 2=Stage, 3=主流程/Expression, 4=变量, 5=销售, 6=波形, 7=桥接, 8=通用
## 1. 主流程总览
```mermaid
flowchart TB
subgraph entry ["入口"]
Start --> VarsInit
VarsInit --> Center
end
subgraph center ["Center 调度 (按 $gameStage)"]
Center -->|1| Stage1
Center -->|2| Stage2
Center -->|3| Stage3
Center -->|4| Stage4
Center -->|5| Stage5
Center -->|6| Stage6
Center -->|7| Stage7
Center -->|8| Stage8
Center -->|100| 测试
Center -->|999| NextYarn
end
subgraph stage_flow ["Stage 流转"]
Stage1 --> S1_end["gameStage=2"]
Stage2 --> S2_end["gameStage=3"]
Stage3 --> S3_end["gameStage=4"]
Stage4 --> S4_end["gameStage=5"]
Stage5 --> S5_end["gameStage=6"]
Stage6 --> S6_end["gameStage=7"]
Stage7 --> S7_end["gameStage=8"]
Stage8 --> S8_end["gameStage=999"]
S1_end --> Center
S2_end --> Center
S3_end --> Center
S4_end --> Center
S5_end --> Center
S6_end --> Center
S7_end --> Center
S8_end --> Center
end
```
---
## 2. 变量初始化 (VarsInit)
| 变量 | 说明 |
|------|------|
| `$gameStage` | 当前流程阶段 (1-8, 100=测试, 999=结束) |
| `$TaskToDo` | 待完成任务数 |
| `$emoChecked` / `$memoryChecked` / `$logicChecked` / `$eyeChecked` / `$speakerChecked` / `$colorChecked` / `$expressionChecked` | 各模块首次检查标记 |
| `$emoDeepChecked` / `$expressionSentenceGet` / `$hasTimestamp` | 深入检查标记 |
| `$currentSocket` / `$PlugCount` / `$PlugAll` | 插线相关 |
| `$salesTurnIndex` | 销售模块转动轮次 (1-based) |
| `$knobFailCount` | 旋钮调节失败次数 |
---
## 3. Stage 1 - 诊室开场
```mermaid
flowchart LR
Stage1 --> 开头对话
开头对话 -->|"set $gameStage=2"| Center
```
- 内容:火山说笑话、发热 → 去诊室
---
## 4. Stage 2 - 后脑检查(插线)
```mermaid
flowchart TB
Stage2["Stage2 入口"]
Stage2 --> Task["Task: 检查表达模块"]
Task --> 检查表达
subgraph 表达流程
检查表达 -->|"gameStage==2"| 表达完成["完成Task\nModuleHightLight Speak→color\nTask: 检查滤波器"]
表达完成 --> 检查滤波器
end
检查滤波器 -->|"gameStage==2"| 滤波器完成["波形分析\n发现锯齿波\nTask: 检查情绪模块"]
滤波器完成 --> 检查情绪
subgraph 情绪与波形
检查情绪 --> 条件{"speakerChecked &&\ncolorChecked"}
条件 -->|是| 查询情绪波形["对比预测波形与真实情绪\n发现对不上"]
条件 -->|否| 结束
查询情绪波形 --> 结束Stage2["结束Stage2\ngameStage=3"]
end
检查表达 -.->|其他插线| 检查记忆
检查表达 -.->|其他插线| 检查逻辑
检查表达 -.->|其他插线| 检查视觉
检查表达 -.->|其他插线| 检查情绪
```
**Stage2 插线入口(EventNode):**
| 插线节点 | jump 目标 |
|----------|-----------|
| EmoPlugIn | 检查情绪 |
| SpeakPlugIn | 检查表达 |
| LogicPlugIn | 检查逻辑 |
| ColorPlugIn | 检查滤波器 |
| MemoryPlugIn | 检查记忆 |
| EyePlugIn | 检查视觉 |
**关键顺序(gameStage==2):** 表达 → 滤波器 → 情绪(情绪需 speaker+color 都检查过才会对比波形 → 结束Stage2)
---
## 5. Stage 3 - 滤波器深入(步进 + 销售模块)
```mermaid
flowchart TB
Stage3["Stage3 入口\nTask: 检查滤波器处理链路"]
Stage3 --> 步进查看模式
subgraph 步进流程["步进流程(Yarn 仅显示情绪输入,其余由转动监听驱动)"]
步进查看模式 --> 步进_情绪输入["步进_情绪输入\n显示原始情绪波形\n转动发条来检测吧"]
步进_情绪输入 -->|"等待 SalesManager\n转动完成事件"| 销售模块转动完成
end
subgraph EventNode_销售["销售模块转动完成(EventNode 仅桥接,分发到 Stage3"]
销售模块转动完成["销售模块转动完成"]
销售模块转动完成 -->|salesTurnIndex==1| 语义合成["销售转动_语义合成"]
销售模块转动完成 -->|salesTurnIndex==2| 语言审查["销售转动_语言审查"]
销售模块转动完成 -->|salesTurnIndex==3| 异常检测["销售转动_异常检测"]
end
subgraph 安装日志与旋钮["调取安装日志 → 解锁旋钮 → 监听旋钮"]
异常检测 --> 查询异常进程["查询异常进程\n情绪修改器组件"]
查询异常进程 --> 查看安装日志["查看安装日志\n3年无复查"]
查看安装日志 -->|"unlock_knob\n节点结束,等待旋钮"| 等待旋钮["KnobController 监听"]
等待旋钮 -->|"用户转动超阈值"| 处理器单次调节失败
end
subgraph EventNode_旋钮["旋钮失败时 KnobController 跳入(EventNode 仅桥接)"]
处理器单次调节失败["处理器单次调节失败\n<<jump 旋钮调节失败>>"]
处理器单次调节失败 --> 旋钮调节失败
end
subgraph 旋钮调节失败_Stage3["旋钮调节失败 (Stage3)"]
旋钮调节失败["旋钮调节失败"]
旋钮调节失败 -->|knobFailCount==1| 重试["再试一次\nreset_knob"]
旋钮调节失败 -->|knobFailCount>=2| 最终失败["lock_knob + 叙事\njump 结束Stage3"]
end
```
**Stage3 关键流程:**
1. 步进_情绪输入 结束 → 对话暂停,等待玩家转动发条
2. **转1**:销售模块转动完成 → 语义合成完成
3. **转2**:销售模块转动完成 → 语言审查通过
4. **转3**:销售模块转动完成 → 检测异常 → 进入处理器 → lock_knob → 查询异常进程 → 查看安装日志 → unlock_knob → 等待旋钮
5. 旋钮失败 → 处理器单次调节失败(1次重试)→ 处理器功率调节失败 → 结束Stage3
---
## 6. Stage 4 - 表达模块 RAM
```mermaid
flowchart TB
Stage4["Stage4 入口\nTask: 检查表达模块"]
Stage4 --> 检查表达
检查表达 -->|"gameStage==4"| RAM发现["发现未释放log\nRAM溢出"]
RAM发现 --> 结束Stage4["结束Stage4\ngameStage=5"]
```
---
## 7. Stage 5 - 诊室对话
```mermaid
flowchart TB
Stage5["Stage5 入口"]
Stage5 --> 诊室对话["诊室对话\n火山承认+达成共识"]
诊室对话 --> 结束Stage5["结束Stage5\ngameStage=6"]
```
---
## 8. Stage 6 - 释放 RAM
```mermaid
flowchart TB
Stage6["Stage6 入口\nTask: 释放表达模块RAM"]
Stage6 --> 检查表达
检查表达 -->|"gameStage==6"| 释放log["释放log\n自动释放 log1/2/3"]
释放log --> 手动释放["遇到被干扰log\n进入手动释放"]
手动释放 --> 手动释放log["手动释放log\nswitch Expression"]
手动释放log --> LOG1["LOG1: 哈哈|嘿嘿|呵呵 → 我很害怕"]
LOG1 --> LOG1梳理完成
LOG1梳理完成 --> LOG2["LOG2: ... → 她都是为了我"]
LOG2 --> LOG2梳理完成
LOG2梳理完成 --> LOG3["LOG3: ... → 我不想再继续逃了"]
LOG3 --> LOG疏通全部完成
LOG疏通全部完成 --> 结束Stage6["结束Stage6\ngameStage=7"]
```
---
## 9. Stage 7 - 最终检查
```mermaid
flowchart TB
Stage7["Stage7 入口\nTaskToDo=2"]
Stage7 --> Task1["Task: 检查表达模块"]
Stage7 --> Task2["Task: 检查滤波器"]
检查表达 -->|"gameStage==7"| 表达OK["完成Task\nTaskToDo--"]
检查滤波器 -->|"gameStage==7"| 滤波器OK["完成Task\nTaskToDo--"]
表达OK --> 判断1{"TaskToDo==0?"}
滤波器OK --> 判断1
判断1 -->|是| 结束Stage7["结束Stage7\ngameStage=8"]
判断1 -->|否| 继续["继续等待另一项完成"]
```
---
## 10. Stage 8 - 结束对话
```mermaid
flowchart TB
Stage8["Stage8 入口"]
Stage8 --> 结束对话["结束对话\n火山说出真话"]
结束对话 -->|"gameStage=999"| Center
```
---
## 11. EventNode 与波形节点
```mermaid
flowchart TB
subgraph 插线入口
EmoPlugIn
SpeakPlugIn
LogicPlugIn
ColorPlugIn
MemoryPlugIn
EyePlugIn
end
subgraph 销售相关
销售模块转动完成
处理器单次调节失败
处理器功率调节失败
end
subgraph 波形
波形_显示并连接
波形_显示情绪
波形_显示滤波器输出
波形_隐藏
end
```
---
## 12. Debug 检查清单
| 现象 | 可能原因 | 检查点 |
|------|----------|--------|
| 流程卡住 | `$gameStage` 未正确更新 | Center 各 Stage 分支 |
| Stage2 不推进 | 表达/滤波器/情绪未按顺序完成 | 检查表达→滤波器→情绪,以及 speakerChecked+colorChecked |
| Stage3 步进不走 | 未从滤波器进入步进;或 SalesManager 未触发转动完成 | 检查滤波器 gameStage==3 的「进入步进查看模式」;检查 totalTurns≥3、crankCompleteNode |
| 销售模块无反馈 | SalesManager/KnobController 未跳转 | EventNode: 销售模块转动完成、处理器单次调节失败 |
| Stage4 无法进 | 需从 Stage3 结束 或 处理器功率调节失败 | 结束Stage3 与 处理器功率调节失败 都 `<<jump 结束Stage3>>` |
| Stage6 手动释放卡住 | Expression 模块/restart_expression | start_expression / restart_expression 完成节点 |
| Stage7 TaskToDo 不清零 | 表达/滤波器 有一项未完成 | 两项都需 `complete_task``TaskToDo--` |
| 测试模式 | gameStage=100 | 测试 节点直接进入 Sales+EmotionWave |
---
## 13. 文件与节点索引
| 文件 | 节点 |
|------|------|
| Center.yarn | Start, VarsInit, Center, 测试 |
| EventNode.yarn | EmoPlugIn, SpeakPlugIn, LogicPlugIn, ColorPlugIn, MemoryPlugIn, EyePlugIn, 销售模块转动完成, 处理器单次调节失败(桥接), 波形_* |
| Stage1.yarn | Stage1, 开头对话 |
| Stage2.yarn | Stage2, 检查表达, 检查滤波器, 检查情绪, 检查记忆, 检查逻辑, 检查视觉, 结束Stage2 |
| Stage3.yarn | Stage3, 步进查看模式, 步进_情绪输入, 销售转动_语义合成/语言审查/异常检测, 查询异常进程, 查看安装日志, 旋钮调节失败, 结束Stage3 |
| Stage4.yarn | Stage4, 结束Stage4 |
| Stage5.yarn | Stage5, 结束Stage5 |
| Stage6.yarn | Stage6, 手动释放log, LOG1/2/3梳理完成, LOG疏通全部完成, 结束Stage6 |
| Stage7.yarn | Stage7, 结束Stage7 |
| Stage8.yarn | Stage8, 结束对话 |