351 lines
10 KiB
Markdown
351 lines
10 KiB
Markdown
# 分析模式 (Analysis Mode) 使用说明
|
||
|
||
## 概述
|
||
|
||
分析模式是一个记忆解密游戏,玩家需要通过调节情绪频率来过滤网格中的词语,并使用解码器条纹来验证正确的句子。
|
||
|
||
## 功能特性
|
||
|
||
### 1. 核心玩法
|
||
- **20x20 网格系统**:展示焦虑词语粒子(笑话片段掩盖真实情绪词)
|
||
- **情绪频率调节**:通过滑动条调节情绪频率(0-100 Hz)来过滤显示不同情绪的词语
|
||
- **解码器条纹**:可拖拽的解码器条纹,用于验证正确的词语位置
|
||
- **验证系统**:当条纹位置和情绪频率都正确时,可以解密出完整句子
|
||
|
||
### 2. 情绪类型
|
||
- **Joy(快乐)**:频率 15 Hz,颜色黄色
|
||
- **Sadness(悲伤)**:频率 40 Hz,颜色蓝色
|
||
- **Anger(愤怒)**:频率 65 Hz,颜色红色
|
||
- **Fear(恐惧)**:频率 90 Hz,颜色紫色
|
||
- **Neutral(中性/噪音)**:无固定频率,灰色
|
||
|
||
### 3. 显示效果
|
||
- **锁定区(距离 < 5 Hz)**:显示真实词语,高亮显示
|
||
- **闪烁区(5-20 Hz)**:在真实词和掩盖词之间闪烁
|
||
- **淡出区(20-35 Hz)**:显示掩盖词,逐渐淡化
|
||
- **消失区(> 35 Hz)**:几乎不可见
|
||
|
||
## Unity 编辑器设置
|
||
|
||
### 1. 场景结构(使用共享 Canvas)
|
||
|
||
分析模式共享 LanguageParticleManager 的 WorldSpace Canvas:
|
||
|
||
```
|
||
Expression View
|
||
├── Expression Camera
|
||
├── Expression Deep Camera
|
||
├── Language Particle Manager
|
||
│ └── Language Canvas (WorldSpace Canvas - 共享)
|
||
│ ├── FloatingParticles (粒子系统)
|
||
│ ├── CandidateParticles (粒子系统)
|
||
│ └── Analysis Panel (分析模式UI)
|
||
│ ├── Control Panel (左侧控制区)
|
||
│ │ ├── Emotion Control (情绪控制区)
|
||
│ │ │ ├── Initialize Button
|
||
│ │ │ ├── Frequency Text
|
||
│ │ │ ├── Emotion Slider
|
||
│ │ │ └── Signal Strength Text
|
||
│ │ ├── Start Filter Button
|
||
│ │ ├── Verify Button
|
||
│ │ └── Log Scroll View
|
||
│ │ └── Log Text
|
||
│ └── Grid Container (右侧网格区)
|
||
│ └── Decoder Strip (可拖拽的解码器)
|
||
└── Analysis Mode Manager (AnalysisModeManager 组件)
|
||
```
|
||
|
||
**重要**:所有 UI 元素都在 Language Canvas 上渲染,不需要单独的 Canvas。
|
||
|
||
### 2. 创建预制体
|
||
|
||
#### 网格单元格预制体 (Grid Cell Prefab)
|
||
|
||
1. 创建一个空 GameObject,命名为 `GridCellPrefab`
|
||
2. 添加组件:
|
||
- `RectTransform`
|
||
- `Image`(背景)
|
||
- `AnalysisGridCell`(脚本)
|
||
3. 在子对象中添加 TextMeshPro 组件用于显示文字:
|
||
- 创建子对象 `Text`
|
||
- 添加 `TextMeshProUGUI` 组件
|
||
- 设置对齐方式为居中
|
||
- 设置字体大小为 13
|
||
|
||
#### 解码器条纹预制体 (Decoder Strip Prefab)
|
||
|
||
1. 创建一个空 GameObject,命名为 `DecoderStripPrefab`
|
||
2. 添加组件:
|
||
- `RectTransform`
|
||
- `Image`(背景,颜色为半透明青色)
|
||
- `CanvasGroup`
|
||
- `Outline`(边框效果)
|
||
- `AnalysisDecoderStrip`(脚本)
|
||
3. 设置大小为 `stripWidth * cellSize` x `stripHeight * cellSize`
|
||
|
||
### 3. AnalysisModeManager 配置
|
||
|
||
在 Inspector 中配置以下参数:
|
||
|
||
#### Canvas 引用(共享)
|
||
- `Shared Canvas`:拖入 LanguageParticleManager 的 Language Canvas(WorldSpace Canvas)
|
||
|
||
#### UI 引用
|
||
- `Analysis Panel`:主面板 RectTransform(在 Language Canvas 下)
|
||
- `Initialize Button`:初始化按钮
|
||
- `Emotion Slider`:情绪滑动条
|
||
- `Frequency Text`:频率显示文本
|
||
- `Signal Strength Text`:信号强度显示文本
|
||
- `Start Filter Button`:启动过滤按钮
|
||
- `Verify Button`:验证按钮
|
||
- `Log Text`:日志文本
|
||
- `Log Scroll Rect`:日志滚动区域
|
||
|
||
#### 网格配置
|
||
- `Grid Container`:网格容器 RectTransform
|
||
- `Grid Cell Prefab`:网格单元格预制体
|
||
- `Grid Width`:20(网格宽度)
|
||
- `Grid Height`:20(网格高度)
|
||
- `Cell Size`:45(单元格大小)
|
||
- `Cell Gap`:2(单元格间距)
|
||
|
||
#### 解码器条纹
|
||
- `Decoder Strip`:解码器条纹 RectTransform
|
||
- `Strip Hole Prefab`:条纹孔洞预制体(可选)
|
||
- `Strip Width`:5(条纹宽度,列数)
|
||
- `Strip Height`:3(条纹高度,行数)
|
||
|
||
#### 动画配置
|
||
- `Panel Slide Duration`:0.5(面板滑动时间)
|
||
- `Data Load Duration`:1.5(数据加载时间)
|
||
- `Slide Ease`:OutCubic(滑动缓动曲线)
|
||
|
||
#### 焦虑短句配置
|
||
- 添加多个焦虑短句,用于填充网格(每个短句会被分割成2字符片段)
|
||
|
||
#### 目标配置
|
||
- `Target Sentence`:目标句子(例如:"[临检]要来了,不合格[英里]被骂了,这让我很[担心]")
|
||
|
||
### 4. ExpressionManager 配置
|
||
|
||
在 ExpressionManager 中添加对 AnalysisModeManager 的引用:
|
||
|
||
1. 在 Inspector 中找到 `Expression Manager` 组件
|
||
2. 将 `Analysis Mode Manager` 拖拽到 `Analysis Mode Manager` 字段
|
||
|
||
## Yarn 命令接口
|
||
|
||
### 启动分析模式
|
||
|
||
在 Yarn 对话脚本中使用以下命令启动分析模式:
|
||
|
||
```yarn
|
||
<<StartAnalysisMode>>
|
||
```
|
||
|
||
或者带参数:
|
||
|
||
```yarn
|
||
<<StartAnalysisMode "CompletionNodeName">>
|
||
```
|
||
|
||
### 关闭分析模式
|
||
|
||
```yarn
|
||
<<CloseAnalysisMode>>
|
||
```
|
||
|
||
### 完整示例
|
||
|
||
```yarn
|
||
title: 表达系统_分析模式
|
||
---
|
||
角色:现在让我们尝试一种新的方式来理解你的焦虑...
|
||
角色:这是一个记忆解密系统,通过调节情绪频率来寻找隐藏的真相。
|
||
|
||
// 启动分析模式
|
||
<<StartAnalysisMode "表达系统_分析完成">>
|
||
|
||
-> 等待玩家完成...
|
||
===
|
||
|
||
title: 表达系统_分析完成_Success
|
||
---
|
||
角色:做得很好!你成功解密了记忆碎片。
|
||
角色:现在你明白了自己真正担心的是什么...
|
||
|
||
<<CloseAnalysisMode>>
|
||
===
|
||
|
||
title: 表达系统_分析完成_Fail
|
||
---
|
||
角色:似乎还不太对...要不要再试一次?
|
||
|
||
-> 再试一次
|
||
<<StartAnalysisMode "表达系统_分析完成">>
|
||
-> 稍后再说
|
||
<<CloseAnalysisMode>>
|
||
===
|
||
```
|
||
|
||
## C# 代码接口
|
||
|
||
### 在脚本中调用
|
||
|
||
```csharp
|
||
using AibisDream;
|
||
|
||
// 获取 ExpressionManager
|
||
var expressionManager = FixSystemCenter.SystemDic.Get<ExpressionManager>();
|
||
|
||
// 启动分析模式
|
||
List<string> anxietyPhrases = new List<string>
|
||
{
|
||
"临检要来了大家都很紧张只有销售员说终于可以检查业绩了",
|
||
"不合格英里被骂了因为销售业绩太差了",
|
||
"我担心业绩会下滑结果真的下滑了我的担心是对的"
|
||
};
|
||
|
||
expressionManager.StartAnalysisMode(anxietyPhrases, "CompletionNodeName");
|
||
|
||
// 关闭分析模式
|
||
expressionManager.CloseAnalysisMode();
|
||
```
|
||
|
||
## 玩法流程
|
||
|
||
### 完整游戏流程
|
||
|
||
1. **完成语言粒子游戏**:
|
||
- 玩家先完成 LanguageParticleManager 的语言整合游戏
|
||
- 目标粒子连接成功,显示目标句子
|
||
|
||
2. **启动分析模式**:
|
||
- 通过 Yarn 命令启动分析模式
|
||
- 分析控制面板在共享 Canvas 上显示
|
||
|
||
3. **初始化数据**:
|
||
- 在 Emotion Control 区域点击"初始化"按钮
|
||
- 网格开始填充焦虑词语数据(Matrix 风格动画)
|
||
|
||
4. **启动过滤分析**:
|
||
- 点击"启动过滤分析"按钮
|
||
- 解码器条纹出现在网格上
|
||
- 情绪滑动条变为可用
|
||
|
||
5. **调节频率**:
|
||
- 拖动情绪滑动条(0-100 Hz)
|
||
- 观察不同情绪词语的显示效果:
|
||
- 接近目标频率:词语高亮显示
|
||
- 中等距离:闪烁效果
|
||
- 远距离:淡化消失
|
||
|
||
6. **拖动条纹**(可选):
|
||
- 拖动解码器条纹到不同位置
|
||
- 通过条纹的"孔洞"查看下方的词语
|
||
|
||
7. **验证匹配**:
|
||
- 点击"验证对齐"按钮
|
||
- 系统检查:
|
||
- 条纹位置是否正确
|
||
- 情绪频率是否在正确范围内(< 8 Hz 偏差)
|
||
|
||
8. **查看结果**:
|
||
- **成功**:显示完整句子,触发成功对话节点(如 `AnalysisComplete_Success`)
|
||
- **失败**:提示调整频率或位置,触发失败对话节点(如 `AnalysisComplete_Fail`)
|
||
|
||
### 设计意图
|
||
- 分析模式是语言粒子游戏的"深入分析"环节
|
||
- 玩家通过调节情绪频率来"解密"隐藏在笑话中的真实焦虑
|
||
- 整个过程在同一个 WorldSpace Canvas 上完成,保持视觉连贯性
|
||
|
||
## 自定义配置
|
||
|
||
### 修改目标答案
|
||
|
||
在 `AnalysisModeManager.SetupTargets()` 方法中修改目标配置:
|
||
|
||
```csharp
|
||
private void SetupTargets()
|
||
{
|
||
analysisTargets.Clear();
|
||
|
||
// 创建正确答案目标
|
||
var correctTarget = new AnalysisTarget
|
||
{
|
||
name = "Fear Solution 1",
|
||
emotion = EmotionType.Fear,
|
||
stripPosition = new Vector2Int(3, 5), // 条纹正确位置
|
||
isCorrectAnswer = true
|
||
};
|
||
|
||
// 添加目标词
|
||
correctTarget.words.Add(new TargetWord
|
||
{
|
||
position = new Vector2Int(3, 5),
|
||
word = "临检",
|
||
cover = "检查"
|
||
});
|
||
|
||
// ... 添加更多目标词
|
||
|
||
analysisTargets.Add(correctTarget);
|
||
}
|
||
```
|
||
|
||
### 修改情绪配置
|
||
|
||
在 `EmotionConfig` 类中修改情绪频率和颜色:
|
||
|
||
```csharp
|
||
public static EmotionConfig Fear => new EmotionConfig
|
||
{
|
||
type = EmotionType.Fear,
|
||
frequency = 90f, // 修改频率
|
||
color = new Color(0.67f, 0f, 1f, 1f), // 修改颜色
|
||
displayName = "FEAR"
|
||
};
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 问题:网格没有显示
|
||
- 检查 `Grid Container` 是否正确设置
|
||
- 检查 `Grid Cell Prefab` 是否正确配置
|
||
- 确保焦虑短句列表不为空
|
||
|
||
### 问题:解码器条纹无法拖动
|
||
- 检查 `AnalysisDecoderStrip` 组件是否添加
|
||
- 确保 `isDraggable` 设置为 true
|
||
- 检查是否有 `EventSystem` 在场景中
|
||
|
||
### 问题:验证总是失败
|
||
- 检查 `SetupTargets()` 中的目标位置是否正确
|
||
- 确保情绪频率设置在正确范围内(< 8 Hz 偏差)
|
||
- 检查日志输出,查看条纹位置和频率信息
|
||
|
||
## 性能优化建议
|
||
|
||
- 网格大小建议不超过 25x25
|
||
- 单元格数量过多时,考虑使用对象池
|
||
- 过滤效果更新频率可以降低(例如每 0.1 秒更新一次)
|
||
- 使用 DOTween 的 `.SetRecyclable(true)` 来减少 GC
|
||
|
||
## 未来扩展
|
||
|
||
- 添加多个解码器条纹孔洞位置配置
|
||
- 支持条纹自动吸附到网格
|
||
- 添加音效和粒子效果
|
||
- 支持多个正确答案
|
||
- 添加提示系统
|
||
- 记录玩家尝试次数和时间
|
||
|
||
## 版本历史
|
||
|
||
- **v1.0.0**(2025-12-09):初始版本
|
||
- 基础网格系统
|
||
- 情绪过滤功能
|
||
- 解码器条纹
|
||
- Yarn 命令接口
|
||
|