docs(huoshan): 同步屏幕stress与pulse命令文档
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -87,7 +87,7 @@ hs: 我感觉自己……像个<shake a=0.6><color=\#2B2B2B>■■</color></shak
|
||||
|
||||
## LOG1 / LOG2 爆发段:写在聚合曲线里的挣扎
|
||||
|
||||
> **2026-07 改版。** 早先用 `expression_focus_interference "in"` 让真话的字逐个变成「帽问题/冇问题」并红色跳动,反馈是**出戏**——读起来是老虎机 / UI 故障,是机器在坏,不是火山在痛;`expression_face_error` 的红脸报错同样被判定为"很怪"。
|
||||
> **2026-07 改版。** 早先有一个 `expression_focus_interference` 命令,让真话的字逐个变成「帽问题/冇问题」并红色跳动,反馈是**出戏**——读起来是老虎机 / UI 故障,是机器在坏,不是火山在痛;`expression_face_error` 的红脸报错同样被判定为"很怪"。**该命令连同其实现已整体删除**(Yarn 注册、`ExpressionManager` / `LanguageParticleManager` 中的传播协程与私有辅助方法),不要再引用;`CandidateParticle` 上的 `focusInterference*` 字段被 focus 阶段与 LOG3 真话攻击共用,予以保留。
|
||||
>
|
||||
> 现行方案:**失败感全部来自聚合进度曲线本身**。`BeginTruthGather` 原本是单条 `Ease.InOutSine`,平滑单调的曲线天然读作"顺利",所以挣扎只能靠外挂特效补。`expression_truth_strain` 改用带回抽的 Sequence,回抽幅度跨过 `UpdateTruthGatherLock` 的 0.08 解锁带,**字就会自己锁上又崩开、反复**;末拍 `expression_truth_collapse` 把进度一口气拽回 0。
|
||||
>
|
||||
@@ -168,27 +168,56 @@ hs: <rainb>我?*帽*问题?冇问题!...</rainb> // 笑话覆盖,接
|
||||
|
||||
| 命令 | 参数 | 行为 |
|
||||
|---|---|---|
|
||||
| `expression_screen_glitch` | `level duration` | 把“屏幕”Sprite 的故障推到 `level`(`0–1`)并**保持住**,`duration` 是从当前档位过渡到该档位的时间。**不会自动回落**——收掉要再写一条 `<<expression_screen_glitch 0 1.2>>`。作用在屏幕材质本身(`AibisDream/HuoshanScreenGlitch`),不是叠一层噪波。 |
|
||||
| `expression_screen_stress` | `amount duration` | **蓄压**:往底压罐里加 `amount`(建议 `0.08–0.2`),只升不降,一直保持。这是"积蓄的情绪"。有软上限 `screenStressCap`(默认 0.85),堆不满,顶格留给 pulse。 |
|
||||
| `expression_screen_pulse` | `strength decay` | **冲击**:瞬间顶到「底压 + `strength`」(建议 `0.3–0.8`),随后在 `decay` 内自动落回底压。一句狠话打一记。 |
|
||||
| `expression_screen_release` | `duration` | **泄压**:底压和脉冲一起放掉归零。屏幕淡出时会自动调用,正常不用手写。 |
|
||||
| `expression_screen_rage` | `level duration` | **转红**:荧光色从青绿推向愤怒红(`#FF304D`)。**武装期间每个 `expression_truth_attack` 会自动 punch 一下屏幕**,力度跟着该词的 `impact` 走——不要在 Yarn 里逐条手写 pulse,攻击列表一重调两边就脱节。`0` 收回。 |
|
||||
| `expression_screen_glitch` | `level duration` | **绝对档位**(旧命令,保留):清掉脉冲并把底压直接设成 `level`。只在"我就是要现在正好这个档位"时用。 |
|
||||
|
||||
### 屏幕 Glitch 的用法
|
||||
|
||||
档位式而不是脉冲式,是因为这段演出要表达的是「火山想说真心话、卡在喉咙里说不出来」——需要一段**能持续压着**的情绪,而不是闪一下就没。Shader 内部自带「憋气→用力→泄掉」的循环(`_SurgeRate`),所以保持在某个档位时屏幕仍在持续挣扎,不会变成一张静止花屏;档位越高,循环越急促、卡喉(冻帧)越频繁。
|
||||
情绪用**底压 + 冲击**两个量叠加,而不是每句手写一个绝对档位。手写绝对档位等于让编剧扮演积分器——既要记得上次是多少,又因为"开场想给一记狠的就必须把持续档位拉高"而在后面失去余量。
|
||||
|
||||
典型三拍写法:
|
||||
- **底压**(`stress`)只升不降,随剧情推进一口一口加。它是积蓄本身。
|
||||
- **冲击**(`pulse`)瞬时叠在底压上再自动衰回去。开场底压才 0.1,一记 `0.6` 的 pulse 照样打得很响,打完落回安静。
|
||||
|
||||
**Stage6 的实际写法是"谎话一开口就坏,一路坏到释放"**——谎话段落里不写任何回落,每被逼问一次就再加一口,最后配合 timeline 顶满再泄:
|
||||
|
||||
```yarn
|
||||
<<expression_screen_glitch 0.55 1.2>> // 顶上来
|
||||
<<expression_screen_stress 0.25 0.7>> // 谎话开口,屏幕开始坏
|
||||
hs: <rainb>广告腔台词</rainb>
|
||||
<<expression_screen_glitch 0.18 1.5>> // 压低憋着,不散
|
||||
<<expression_screen_stress 0.10 2>> // 说完不回落,再坏一档
|
||||
me: 火山!说出来!
|
||||
<<expression_screen_glitch 0 1.2>> // 泄掉
|
||||
<<expression_screen_stress 0.12 1.5>> // 被逼问,再坏
|
||||
hs: 我……
|
||||
<<expression_truth_gather 0.8 3>>
|
||||
<<expression_screen_stress 0.15 3>> // 真话往上聚,屏幕最撑不住的时候
|
||||
<<start_timeline "火山Glitch/火山头痛2">>
|
||||
<<expression_screen_pulse 0.45 0.5>> // 配合 timeline 顶满
|
||||
<<expression_screen_release 0.5>> // 一口气释放
|
||||
```
|
||||
|
||||
档位参考:`0.15–0.25` 底噪憋着;`0.45–0.6` 明显被顶开;`0.85+` 撕裂带里开始冒彩色雪花(永远不会全屏接管)。
|
||||
三段 LOG 的**起手**一段比一段重(`0.25 / 0.32 / 0.38`),段内各自累加到 `0.6~0.85`。段与段之间屏幕会淡出并自动泄压,所以递进靠起手值而不是跨段累计——唯一的例外是 LOG3:`LOG疏通全部完成` 从淡入到落幕全程不淡出,LOG3 爆发段积的底压会一路烧进"为什么"高潮,那里再加一口正好顶到上限。
|
||||
|
||||
底压参考:`0.15–0.25` 底噪憋着;`0.45–0.6` 明显被顶开;`0.7+` 开始掉台。`pulse` 只在两种场合用:配合 timeline 的释放(短衰减),和攻击词的 punch(由 `expression_screen_rage` 自动代劳)。
|
||||
|
||||
**升级感靠新症状解锁,不靠"同样的东西更多"**——shader 内部把强度分成三段:`0.15+` 撕裂带与划痕、`0.35+` 场滚动、`0.55+` 掉台(塌成雪花再闪回)。所以底压每爬一格,观众看到的是"电视又多了一种坏法"。
|
||||
|
||||
### Shader 结构与调参
|
||||
|
||||
屏幕贴图是一块近乎均匀的绿,**只位移贴图是看不见的**(早期版本踩过这个坑,撕裂拖抹全被绿色固有色吃掉)。所以 `HuoshanScreenGlitch` 的做法是:所有东西先汇成一条「信号」标量——亮度 + 副载波色带 + 逐行相位误差 + 颗粒 + 撕裂位移——再由**色散调色板**对信号取值上色(三通道相位错开,得到 深蓝→青→白→橙 的连续渐变)。纯 R/G/B 色块是卡通感的来源,所以调色板输出的是连续渐变;拟真感来自密集扫描线、满屏颗粒、光晕溢出和暗角。
|
||||
`HuoshanScreenGlitch` 是一台坏掉的电视,遵守三条原则:
|
||||
|
||||
1. **屏幕是发光体,不是贴图。** 贴图的绿色固有色被抛弃——只取它的**亮度结构**,颜色由 `_PhosphorColor` 荧光色给出。哪怕 `_GlitchIntensity = 0`,屏幕也有荧光面、缓慢下移的刷新暗带、亮度微颤和待机扫描线,所以它平时就"通着电"而不是一张静态贴图。整体乘 `_Emissive` 抬过 1,超出部分交给场景 Bloom 发光。
|
||||
2. **坏掉丢的是「画面」,不是屏幕。** 信号越差,画面内容越暗淡(只在随机某几拍挣扎着闪回一下),顶上来的是电子枪自己画的东西:灰蓝雪花、消隐黑条、回扫亮痕。所以高损坏时屏幕**不再是绿色**——他想说的话正在丢失。
|
||||
3. **症状分段解锁**(见上文),而不是同一种坏法线性变多。
|
||||
|
||||
故障语汇全部来自真实电视:场同步失锁(整幅上滚 + 接缝黑条 + 条附近横向弯折)、行同步误差(逐行细抖 + 撕裂带,带内亮度错档、色相硬错)、色度不稳(YIQ 空间色相漂移 + 色度增益波动)、雪花、掉台。
|
||||
|
||||
> **踩过两次的坑**:偏色一旦改成从色轮 / HSV 取纯 R/G/B/C/M/Y,画面立刻变卡通。偏色只能来自"三个通道对不齐"(通道分离的彩色镶边)或 YIQ 上的连续漂移——这两种都是连续渐变,不会出现纯色块。
|
||||
>
|
||||
> 曾经试过"纯黑屏 + 饱和彩条"的方向(贴图只提供激发量、黑电平以下归零),结论是**太卡通**,已回退。现行版本保留荧光着色 + 灰蓝雪花。
|
||||
|
||||
`_Rage` 由 `expression_screen_rage` 驱动,把荧光整块换成 `_RageColor`(愤怒红 `#FF304D`)。
|
||||
|
||||
**观感的唯一真相源是材质 `M_HuoshanScreenGlitch`**(已默认挂在屏幕 SpriteRenderer 上),选中屏幕物件所见即所得地调。代码只驱动 `_GlitchIntensity` 档位,ExpressionManager 上不再有任何观感字段。
|
||||
|
||||
@@ -198,16 +227,23 @@ me: 火山!说出来!
|
||||
|
||||
| 旋钮 | 作用 | 默认 |
|
||||
|---|---|---|
|
||||
| `_Scale` | **效果尺度**。屏幕物件小、觉得"全是细线"就调大它,彩带/扫描线/颗粒/损坏块一起变粗 | 1.6 |
|
||||
| `_ColorAmount` | 颜色强度 | 1.35 |
|
||||
| `_Warp` | 撕裂、拖抹、块位移的总位移量 | 1 |
|
||||
| `_Chaos` | **错误感**:块级损坏的量与突发频率 | 0.6 |
|
||||
| `_Grit` | 颗粒与扫描线(调到 0 立刻变卡通) | 1 |
|
||||
| `_SurgeRate` | 情绪泵节奏,越大越焦躁 | 0.5 |
|
||||
| `_Scale` | **效果尺度**。屏幕物件小、觉得"全是细线"就调大它,扫描线/雪花/撕裂带一起变粗 | 1.6 |
|
||||
| `_ColorDamage` | 色彩损伤:色相漂移 + 色度增益不稳 + 彩色镶边。嫌偏色过头就减 | 1 |
|
||||
| `_Warp` | 撕裂与滚屏的总位移量 | 1 |
|
||||
| `_Chaos` | **掉台频率**:信号中断爆发的概率(仅高档解锁) | 0.5 |
|
||||
| `_Grit` | 雪花与扫描线。嫌脏就减,调到 0 会失去"被拍下来"的质感 | 1 |
|
||||
| `_SurgeRate` | 情绪节奏,越大越焦躁 | 0.5 |
|
||||
|
||||
外加四个基调:`_Dispersion`(三通道相位差,小=轻微色偏,接近 0.33=满彩虹)、`_PalPhase`(偏色)、`_Desaturate`(绿色固有色退场多少)、`_Vignette`。
|
||||
外加基调:
|
||||
|
||||
**块级损坏**是"错误感"的来源:在随机时隙里整块整块地错位、换色、旋转通道(`col.gbr`),而不是均匀连续地抖——均匀就是规律,规律就读作假。大块宽而扁(像整段数据行被搬走),小块负责细节啃咬。
|
||||
| 属性 | 作用 | 默认 |
|
||||
|---|---|---|
|
||||
| `_PhosphorColor` | **屏幕自身的荧光色**(替代贴图固有色) | 青绿白 |
|
||||
| `_RageColor` | 愤怒红,由 `_Rage` 混入 | `#FF304D` |
|
||||
| `_Emissive` | 发光增益,>1 的部分喂给 Bloom | 1.5 |
|
||||
| `_Ghost` / `_BloomBoost` / `_Vignette` | 鬼影 / 掉台恢复过冲 / 暗角 | 0.35 / 0.6 / 0.28 |
|
||||
|
||||
想换屏幕颜色直接改 `_PhosphorColor`,不用碰贴图——贴图只提供亮度结构。
|
||||
|
||||
> **`screenOverlayRenderer` 的材质绝不能置 null**——SpriteRenderer 的 material 为 null 会渲染成品红方块,表现为 `switch_fix_system_to Expression` 后闪一下粉色。需要换掉 Glitch 材质时走 `GetScreenFallbackMaterial()`(`Sprites/Default` 兜底)。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user