# 语言粒子系统 - Unity实现 ## 概述 这是一个基于P5.js原型的语言粒子互动系统,在Unity中复现。系统通过文字粒子的连接和交互,表现情绪的传播与平复过程。 ## 文件结构 ``` Language/ ├── LanguageParticleSystem_Summary.md # 效果总结文档 ├── README.md # 使用说明(本文件) ├── TextParticle.cs # 文字粒子基类 ├── FloatingTextParticle.cs # 背景浮动文字粒子 ├── CandidateParticle.cs # 可交互候选粒子 ├── WaveformPoint.cs # 波形点数据 ├── EffectPropagation.cs # 效果传播系统 ├── ConnectionRenderer.cs # 连接线渲染器 ├── WaveformRenderer.cs # 波形渲染器 └── LanguageParticleManager.cs # 主管理器 ``` ## 使用步骤 ### 1. 场景设置 1. 创建一个空GameObject,命名为"LanguageParticleSystem" 2. 添加`LanguageParticleManager`组件 ### 2. Canvas设置 系统会自动创建一个10x10的World Space Canvas,也可以手动配置: 1. 创建Canvas(Render Mode: World Space) 2. 设置Canvas尺寸为10x10 3. 将Canvas拖到Manager的`worldCanvas`字段 ### 3. 参数配置 在Inspector中调整以下参数: #### Canvas设置 - **Canvas Size**: Canvas大小(默认10) - **Text Margin**: 文字区域边距(默认1) #### 粒子数量 - **Floating Count**: 背景浮动文字数量(默认100) - **Candidate Count**: 候选粒子数量(默认50) - **Red Particle Count**: 红色目标粒子数量(默认8) #### 游戏参数 - **Connection Distance**: 连接距离阈值(默认2,Unity单位) - **Target Sentence**: 目标句子(默认"别过来我感觉害怕") #### 波形参数 - **Waveform Amplitude**: 波形振幅(默认0.3) - **Interaction Radius**: 交互半径(默认0.5) ### 4. 依赖项 确保项目中已安装以下插件: - **TextMeshPro**: Unity内置,用于中文文字渲染 - **DOTween**: 用于动画效果 - **Shapes**: 用于绘制连接线和波形 ### 5. 运行 点击Play即可运行。系统会自动: 1. 生成背景浮动文字 2. 生成候选粒子 3. 随机选择8个红色目标粒子 ## 游戏玩法 ### 第一阶段:连接红色粒子 **目标**:让所有红色粒子连接成一个整体,且与蓝色粒子分离 **交互**: - 左键点击:产生排斥波,推开附近粒子 - 右键点击:产生涟漪,吸引附近粒子 **机制**: - 红色粒子与蓝色粒子接触时,效果会传播(蓝色→橙色) - 效果可以链式传播(最多8步) - 橙色粒子字符变化加速,带有振动和光晕效果 ### 第二阶段:文字揭示 完成第一阶段后: 1. 红色粒子自动排列成水平一行 2. 蓝色粒子淡出 3. 红色粒子逐个揭示目标文字:"别过来我感觉害怕" 4. 文字出现剧烈抖动(焦虑效果) ### 第三阶段:波形交互 文字显示完成后: 1. 文字下方出现异常波形(基于Perlin噪声) 2. 文字随波形剧烈抖动和漂浮 3. **目标**:通过鼠标抚平波形,平复文字的焦虑 **交互**: - 按住鼠标左键并拖动,抚平附近的波形 - 波形有"抵抗力",需要持续按住(0.5-1.5秒) - 拖动速度越快,抚平效果越强 **效果**: - 波形从红色异常噪波→蓝色规律正弦波 - 文字抖动和漂浮逐渐减弱 - 波形完全稳定后,文字开始消散 - 所有文字消散后,游戏自动重置 ## 技术要点 ### 1. 粒子系统 - 使用TextMeshPro渲染中文字符 - 粒子具有速度、边界检测、相互排斥 - 字符定期随机变化 ### 2. 连接检测 - 使用空间距离判断粒子间连接 - 连接关系存储在`connections`列表中 - 用于效果传播和完成条件判断 ### 3. 效果传播 - 红色粒子与蓝色粒子建立新连接时触发 - 使用队列实现链式传播 - 脉冲动画沿连接线移动 ### 4. 波形系统 - 使用Perlin噪声生成异常波形(多层噪声叠加) - 每个波形点关联一个文字粒子 - 波形点有独立的抚平进度和抵抗力 - 抚平后波形变为规律正弦波 ### 5. 渲染系统 - 使用Shapes的ImmediateModeShapeDrawer - 连接线:实时绘制粒子间连线 - 波形:使用Polyline绘制平滑曲线 - 效果:脉冲光点、箭头、进度环 ## 性能优化建议 1. **对象池**:粒子频繁创建销毁时使用对象池 2. **空间分区**:粒子数量超过100时考虑Grid分区 3. **LOD**:远距离粒子降低更新频率 4. **批量绘制**:Shapes已支持批量绘制 5. **异步处理**:连接检测可使用Job System ## 自定义扩展 ### 添加新的文字内容 修改`CandidateParticle.cs`中的字符集: ```csharp protected static string chineseChars = "你的字符集..."; protected static string[] chineseWords = { "词组1", "词组2", ... }; ``` ### 修改目标句子 在Manager的Inspector中修改`Target Sentence`字段 ### 调整波形特性 修改`WaveformPoint.cs`中的噪声参数: ```csharp noiseScale1 = 0.05f; // 低频噪声 noiseScale2 = 0.15f; // 中频噪声 noiseScale3 = 0.4f; // 高频噪声 ``` ### 添加音效 在以下关键事件添加音效: - `TriggerEffectPropagation()`: 效果传播时 - `StartCompletionSequence()`: 完成第一阶段时 - `WaveformPoint.Update()`: 波形抚平时(`calmAmount >= 0.95f`) - `ResetGame()`: 游戏重置时 ## 调试技巧 1. **显示连接关系**:在Scene视图中观察连接线 2. **波形可视化**:查看波形点的`calmAmount`值 3. **粒子状态**:在Inspector中实时查看粒子的`isRed`、`isOrange`等状态 4. **帧率监控**:粒子数量过多时注意帧率 ## 常见问题 ### Q: 文字显示为方块? A: 确保使用支持中文的字体,并在TextMeshPro Font Asset中生成中文字符 ### Q: 连接线不显示? A: 检查Shapes插件是否正确安装,Camera是否正确配置 ### Q: 波形交互没反应? A: 检查鼠标世界坐标转换是否正确,确保Camera能看到粒子 ### Q: 性能问题? A: 减少粒子数量,或启用对象池和空间分区优化 ## 许可 本项目基于P5.js原型复现,供学习和研究使用。