diff --git a/Docs/HuoShan/LogReleaseYarnCommands.md b/Docs/HuoShan/LogReleaseYarnCommands.md index 6c0a73660..45056f070 100644 --- a/Docs/HuoShan/LogReleaseYarnCommands.md +++ b/Docs/HuoShan/LogReleaseYarnCommands.md @@ -46,11 +46,11 @@ hs: 我感觉自己……像个■■■■■■■■`),玩家点击推进后目标字聚拢、似乎要说出来,又被谎话大字砸断炸散。三次递进(聚合目标 0.55 → 0.72 → 0.92)后进入乱码块与"没问题"的疯狂闪切,最后停在"没问题",由 glitch 翻转成真话。 +> **2026-07 改版。** 早先用 `expression_focus_interference "in"` 让真话的字逐个变成「帽问题/冇问题」并红色跳动,反馈是**出戏**——读起来是老虎机 / UI 故障,是机器在坏,不是火山在痛;`expression_face_error` 的红脸报错同样被判定为"很怪"。 +> +> 现行方案:**失败感全部来自聚合进度曲线本身**。`BeginTruthGather` 原本是单条 `Ease.InOutSine`,平滑单调的曲线天然读作"顺利",所以挣扎只能靠外挂特效补。`expression_truth_strain` 改用带回抽的 Sequence,回抽幅度跨过 `UpdateTruthGatherLock` 的 0.08 解锁带,**字就会自己锁上又崩开、反复**;末拍 `expression_truth_collapse` 把进度一口气拽回 0。 +> +> **LOG1 / LOG2 全段不使用红色,也不使用脸部报错。** 红(`#FF304D` / `truthAttackColor`)只留给 LOG3 的愤怒攻击段,第一次出现才有力量。 | 命令 | 参数 | 行为 | |---|---|---| | `expression_truth_gather` | `target duration` | 真话聚合尝试(不等待):目标字被慢慢拉向最终位置、乱跳收敛,并按字序逐个锁定成真心话字符。`target<1` 时最后几个字永远差一点锁不住(锁字判定用原始进度,阈值 0.45~0.95 阶梯)。 | +| `expression_truth_strain` | `target duration tugs` | **聚合挣扎(不等待)**:推进途中做 `tugs` 次"够到一点又被拽回去",每次比上次够得更远,最后一次刚好摸到 `target` 再被拽回,末尾单独一段推进停在 `target`。回抽幅度 0.10 起、逐次加深,保证越过解锁带让已锁的字崩开重新乱跳。`tugs` 取 0~4;`<=0` 时退化为 `expression_truth_gather`。 | +| `expression_truth_collapse` | `duration` | **聚合崩塌(不等待)**:进度被一口气拽回 0,所有字沿原路退回悬浮位并恢复乱跳。用 `Ease.InBack`,会先向上顶一点点再垮掉——"又够了一下下,然后整个塌了"。与 `expression_truth_scatter` 的区别:scatter 是径向爆散,collapse 是被拽回去。 | | `expression_truth_scatter` | `burst` | 聚合被打断(不等待):目标字向外爆散(世界单位距离)并恢复乱跳、解除已锁定字符。谎话 flash 期间粒子隐藏,所以要放在 flash 命令之后,让字符"带着爆散重现"。 | -| `expression_face_error` | `duration intensity` | 火山脸错误闪红(不等待):短暂替换为红屏 Sprite,随后恢复,并轻微下沉。`intensity` 为旧脚本兼容参数。 | +| `expression_face_error` | `duration intensity` | 火山脸错误闪红(不等待):短暂替换为红屏 Sprite,随后恢复,并轻微下沉。**已被反馈判定为出戏,LOG1/LOG2 不再使用**,仅保留兼容。 | + +LOG1 / LOG2 现行三拍递进: + +```yarn +hs: ...我... +<> // 第1拍:够到一次,被拽回一次 +<> +hs: ...我感觉自己... +<> // 第2拍:抽搐加剧 +<> +hs: ...我就是个... +<> // 第3拍:最接近,抖得最凶 +<> +<> // 崩回 0 +<> +hs: 我?*帽*问题?冇问题!... // 笑话覆盖,接住崩塌 +``` | `expression_truth_lie_flicker` | `"lie1\|lie2" "censored" duration interval fontSize` | 快速真假闪切(不等待,节奏由同长度 `wait` 控制):乱码块(暖色字+暖底色)与谎话(冷白字+冷底色)交替独占屏幕,越到后面切得越快,**结束定格在第一条谎话**。底色即"电视头背景",在 Inspector 的 `truthBackdropColor` / `lieBackdropColor` 调。 | | `expression_lie_morph_truth` | `"lie" "truth" duration` | 定格的谎话被 glitch 翻转成真话(等待):大字乱跳中长度从谎话渐变到真话、真假底色抢闪,最后落在暖色真话并轻微收缩定住。紧接 `expression_memory_cut` + `expression_truth_snap`,说出口的那一刻其余效果全部消失。 | | `expression_truth_blackout` | `duration alpha` | 顿挫黑一拍(等待):停掉闪切、隐藏大字并保持黑场。当前 LOG1 未使用,保留备用。 | @@ -118,11 +141,11 @@ hs: 我感觉自己……像个■■■■> ``` +## 屏幕 Glitch + +命令非阻塞,不会延迟对白: + +| 命令 | 参数 | 行为 | +|---|---|---| +| `expression_screen_glitch` | `level duration` | 把“屏幕”Sprite 的故障推到 `level`(`0–1`)并**保持住**,`duration` 是从当前档位过渡到该档位的时间。**不会自动回落**——收掉要再写一条 `<>`。作用在屏幕材质本身(`AibisDream/HuoshanScreenGlitch`),不是叠一层噪波。 | + +### 屏幕 Glitch 的用法 + +档位式而不是脉冲式,是因为这段演出要表达的是「火山想说真心话、卡在喉咙里说不出来」——需要一段**能持续压着**的情绪,而不是闪一下就没。Shader 内部自带「憋气→用力→泄掉」的循环(`_SurgeRate`),所以保持在某个档位时屏幕仍在持续挣扎,不会变成一张静止花屏;档位越高,循环越急促、卡喉(冻帧)越频繁。 + +典型三拍写法: + +```yarn +<> // 顶上来 +hs: 广告腔台词 +<> // 压低憋着,不散 +me: 火山!说出来! +<> // 泄掉 +``` + +档位参考:`0.15–0.25` 底噪憋着;`0.45–0.6` 明显被顶开;`0.85+` 撕裂带里开始冒彩色雪花(永远不会全屏接管)。 + +### Shader 结构与调参 + +屏幕贴图是一块近乎均匀的绿,**只位移贴图是看不见的**(早期版本踩过这个坑,撕裂拖抹全被绿色固有色吃掉)。所以 `HuoshanScreenGlitch` 的做法是:所有东西先汇成一条「信号」标量——亮度 + 副载波色带 + 逐行相位误差 + 颗粒 + 撕裂位移——再由**色散调色板**对信号取值上色(三通道相位错开,得到 深蓝→青→白→橙 的连续渐变)。纯 R/G/B 色块是卡通感的来源,所以调色板输出的是连续渐变;拟真感来自密集扫描线、满屏颗粒、光晕溢出和暗角。 + +**观感的唯一真相源是材质 `M_HuoshanScreenGlitch`**(已默认挂在屏幕 SpriteRenderer 上),选中屏幕物件所见即所得地调。代码只驱动 `_GlitchIntensity` 档位,ExpressionManager 上不再有任何观感字段。 + +> 历史教训:曾经有过 40 个属性、且同时散落在材质和组件两边,结果**根本没法调**。加参数前先想清楚能不能从现有旋钮推导出来。 + +只有 6 个宏观旋钮,内部十几个系数全部由它们推导: + +| 旋钮 | 作用 | 默认 | +|---|---|---| +| `_Scale` | **效果尺度**。屏幕物件小、觉得"全是细线"就调大它,彩带/扫描线/颗粒/损坏块一起变粗 | 1.6 | +| `_ColorAmount` | 颜色强度 | 1.35 | +| `_Warp` | 撕裂、拖抹、块位移的总位移量 | 1 | +| `_Chaos` | **错误感**:块级损坏的量与突发频率 | 0.6 | +| `_Grit` | 颗粒与扫描线(调到 0 立刻变卡通) | 1 | +| `_SurgeRate` | 情绪泵节奏,越大越焦躁 | 0.5 | + +外加四个基调:`_Dispersion`(三通道相位差,小=轻微色偏,接近 0.33=满彩虹)、`_PalPhase`(偏色)、`_Desaturate`(绿色固有色退场多少)、`_Vignette`。 + +**块级损坏**是"错误感"的来源:在随机时隙里整块整块地错位、换色、旋转通道(`col.gbr`),而不是均匀连续地抖——均匀就是规律,规律就读作假。大块宽而扁(像整段数据行被搬走),小块负责细节啃咬。 + +> **`screenOverlayRenderer` 的材质绝不能置 null**——SpriteRenderer 的 material 为 null 会渲染成品红方块,表现为 `switch_fix_system_to Expression` 后闪一下粉色。需要换掉 Glitch 材质时走 `GetScreenFallbackMaterial()`(`Sprites/Default` 兜底)。 + +### 记忆图上的减弱版 + +`HuoshanMemory.shader` 里加了一层同源的轻量模拟信号层,参数在 `M_HuoshanMemory` 上,同样只有三个:`_AnalogGlitch`(总量,默认 0.25)、`_AnalogScale`(尺度,默认 1.6)、`_AnalogChroma`(色偏)。 + +它只做色偏 + 扫描线 + 颗粒,**不改变画面结构**(色偏以 0 为中心,只染色不提亮),并且 Calm 区(要读字的地方)会自动让位。想让记忆图更脏就调 `_AnalogGlitch`,别去动 `_SimGlitch`——后者是记忆自己的全息模拟层。 + ## 调节建议 -- 谎话“不自然”的主要旋钮是 `expression_truth_squeeze` 的 `jitter`、`expression_lie_show` 的 `characterSpacing`,以及谎话前后的 `wait`。 +- 谎话“不自然”的主要旋钮是 `expression_truth_squeeze` 的 `jitter` 以及谎话前后的 `wait`。 +- LOG1/LOG2 的"纠结"强度主要调 `expression_truth_strain` 的 `tugs`(回抽次数)和 `target`;`target` 越接近 1,越多字会先锁上再崩开,挫败感越强。 - 反转力度优先调 `expression_truth_blackout` 的 `alpha`、`expression_lie_split` 的 `distanceRatio`、`expression_truth_flash` 的 `alpha` 和 `expression_glitch_pulse` 的 `peak`。 -- `expression_memory_tear` 与 `expression_glitch_pulse` 可以同时触发:前者只作用于记忆图,后者位于记忆图和火山脸之间。 +- `expression_memory_tear` 与 `expression_glitch_pulse` 可以同时触发:两者都作用在记忆材质上(撕裂 vs 模拟失真脉冲)。 - `expression_truth_resolve` 是等待命令。其 `duration` 决定 Yarn 何时继续到真话对白,并保证最后一个字符在这个总时长内稳定。 - 硬切节奏用 `start_timeline` 同帧启动 Timeline,然后连续调用 `expression_memory_cut` 与 `expression_truth_snap`;需要等 Timeline 播完时再调用 `wait_timeline`。 - Stage6 三段谎话到真话均使用硬切;Light/Medium/Heavy 的差异只保留在谎话持续期间的跳字、记忆扰动和 Glitch 强度,不再影响真话稳定速度。 @@ -160,8 +239,8 @@ hs: 我感觉自己……像个■■> ``` -- `expression_memory_begin` 参数依次为记忆图、淡入时长、持续推进速度、旧水平速度、是否保留 Glitch、目标 Alpha。LOG1 使用 `2.2 / 0.012 / 0 / false / 1`,一次连续淡入,不再按对白阶梯式补透明度。 -- LOG1 不再使用全屏噪声 glitch:`expression_actor_flash` 的最后一个参数(Glitch 峰值)传 0。 +- `expression_memory_begin` 参数依次为记忆图、淡入时长、持续推进速度、旧水平速度、是否保留 Glitch(已忽略,记忆不再用 noise)、目标 Alpha。LOG1 使用 `2.2 / 0.012 / 0 / false / 1`,一次连续淡入,不再按对白阶梯式补透明度。 +- 记忆段不要再用 `noise` / `glitch_transition`;瞬时故障用 `expression_glitch_pulse` 或 `expression_actor_flash` 的 glitch 峰值(写进记忆材质)。屏幕框故障另走 `expression_screen_glitch`。 - `expression_actor_truth_flash` 后续参数依次为停留、字号、透明度、抖动幅度。 - `expression_actor_flash` 后续参数依次为停留、字号、落定缩放、冲击缩放、色散距离、色散透明度、记忆冲击、Glitch 峰值。 - `expression_actor_word_hit` 最后两个数是字号和冲击缩放。