8.5 KiB
风筝 Yarn 命令使用指南
适用范围:Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn 的 风筝1 / 风筝2 节点。
背景
放风筝段落原来用 D2S风筝1/2/3 三张切图按高度阈值硬切,跨阈值时尺寸跳变,且节点顶部的常驻动效会覆盖选项里的一次性反馈。现已改为单张风筝图 + 连续参数驱动,不再使用切图。
场景入口在 Day2SleepPresentationController.cs,风筝节点与资源由 KitePresentation.cs 管理,连续运动仍由 KiteRigDriver.cs 驱动。命令统一注册在 Day2SleepYarnCommand.cs。
Rig 结构
Kite Rig(高度层:缩放 + 位移,对应 $h)
└─ Kite Sway(风况层:常驻循环,对应 $wind / 乱度)
└─ Kite Accent(顿挫层:一次性动效 + 实际 SpriteRenderer)
Kite Base(白色底图,独立静态节点,不随高度缩放)
Kite Mask(SpriteMask,以底图为形状,风筝层被裁在天空范围内)
三层动效各自持有独立 Tween,互不 Kill,所以选项里的一次性顿挫不会被节点顶部的常驻风况覆盖掉。
只用到两张图(Addressable key Sprite/梦境/{图名}):
D2S风筝1_风筝层:风筝本体,挂在顶层可动。D2S风筝1_底图:白色天空底图,静态显示 + 兼作遮罩形状。
D2S风筝2/3/4/5 全套图不再使用(文件保留,未删除)。
命令一览
| 命令 | 签名 | 说明 |
|---|---|---|
kite_show |
height=0 wind=0 duration=0.35 |
显示风筝 Rig。若已显示则等价于 kite_state(幂等)。会顺带隐藏正在显示的小图/大图。总是把乱度重置为平稳,之后要乱流需再调 kite_wind。 |
kite_state |
height wind duration=0.9 leadDuration=0.35 |
高度补间(缩放+位移,每次选择的主反馈)+ 按当前乱度重放风况循环。leadDuration 是命令返回前的等待时间,一般不用传。 |
kite_wind |
wind turbulence=-1 |
只切换风况循环,不改变高度。用于在选项出现之前 telegraph 风况,让玩家读画面做判断。 |
kite_accent |
profile leadDuration=0.18 |
播放一次性顿挫动效,叠加在顶层,结束后自动回到原位,不打断高度/风况补间。 |
kite_hide |
duration=1 |
隐藏风筝 Rig(含底图、遮罩)。 |
参数含义
height对应 Yarn 变量$h,范围会被 clamp 到[0, 13]。缩放曲线是0.76^height,且不低于 12%(避免缩到看不见)。镜头只补回约 55% 的尺寸变化,因此风筝仍会随高度增加而逐渐变小。wind对应 Yarn 变量$wind:1强风 /0无风 /-1风弱。turbulence(乱度)范围0~1,默认表示平稳(0),不是“保持不变”:- 省略或传负数 → 平稳,风筝沿 CatmullRom 曲线大而缓地漫游(有风时顶风侧倾巡游,无风时自由漂,风弱时缓缓下坠),绝不抖动。
- 传正数 → 阵风:静一下 → 猛地被拽走一截(位移+旋转,X/Y 不同步走出弧线)→ 镜头追回 → 再来一阵。数值越大拉扯越猛、间隔越短;进入超级大风后路线会左右换边,并在每 3~5 次普通出镜后穿插一次“双捕捉”。
- 乱度是粘滞的:由
kite_wind显式设定后会保留,后续kite_state只切高度和风向,仍沿用当前乱度,直到下一次kite_wind改变它。kite_show会把乱度重置为 0。
镜头构图与双捕捉
- 镜头横向完整追赶风筝,纵向只做部分跟随:平静阶段约 42%,乱风阶段约 78%。连续放线时,风筝会在画面里逐渐升高、变小,不会每轮回到相同的特写景别。
- 超级大风的普通出镜保持左右和纵向变化;每经过 3~5 次普通出镜,下一次改为“双捕捉”:第一次出镜后等镜头快要框住,再沿同一方向突然加速;第二次追回时镜头轻微跟过头并一次性收住。
- 双捕捉不会连续触发。乱度降低、隐藏风筝或重新显示风筝时,当前双捕捉与镜头过冲都会取消并重新计数。
- 虚焦和“镜头已捕捉”都按目标构图判断;风筝故意处于画面上方或保持较小尺寸时,不会因此持续虚焦。
kite_accent 支持的 profile
| profile | 效果 | 典型使用场景 |
|---|---|---|
lift |
上冲后回落 | 放线时风筝被吹高 |
sink |
下坠沉降 | 收线、风弱掉高度 |
taut |
猛地扯直,然后绷住小幅慢速拉锯(不是震动) | 线绷紧、风大顶线 |
drop |
猛地下坠(比 sink 更快更急) | 风筝真的掉下去了 |
flutter |
左右交替的几下小拉扯,力度递减 | 保持不动、原地挣扎 |
wrench |
被阵风猛地拽向一侧,停顿后回正 | 强乱流、角色被风筝拖拽 |
轱辘特写(D2S轱辘)不属于这套 Rig,仍使用 <<show_sprite_motion "D2S轱辘" "reel_tension" duration>>;分层、遮罩和常驻拉锯循环由 ReelMotionPresenter.cs 维护:先被猛地拽进受力姿态(只进一次),之后绷在那里持续拉锯,偶尔再被拽深一点——是“全力拉住”的发力感,不会松回原位。
典型用法模式
1. 进入或恢复风筝回合:kite_show
<<set $wind=1>>
<<kite_show {$h} {$wind} 0.35>>
<<kite_wind {$wind} 0>>
kite_show 是幂等的,因此每次进入节点都调用一次:正常回跳时用于同步高度,测试存档直接进入中间回合时则负责创建 Rig。它会重置乱度,所以后面必须紧跟该回合的 kite_wind。
2. 每轮风况变化:先 kite_wind 让画面 telegraph,再给选项
风筝1 / 风筝2 节点里,每次 <<set $wind=...>> 之后紧跟一次 kite_wind,选项出现前画面已经在演风况了:
<<elseif $t==2>>
<<set $wind=1>>
<<kite_wind {$wind} 0.55>>
风忽紧忽慢,杂乱无章…像是有很多声音,又像都只是噪声……
<<kite_accent flutter>>
手里的线猛地收紧了。然后又被猛地松开,像潮汐一样,像…
乱度取值要对着台词:台词说“平稳/懒洋洋”就传 0;出现“粗重、杂乱”时使用 0.4~0.55;进入盘旋上升和失控段后按 0.8 → 0.95 → 1 逐轮加码。文本在同一回合中由乱转稳时,再调用一次 kite_wind 清零乱度。
3. 选项分支:kite_state 是主反馈,kite_accent 是点缀
->放线 #line:08c3eee
<<if $wind==1>>
<<set $h = $h + 1>>
<<kite_state {$h} {$wind}>>
<<kite_accent lift>>
风把风筝吹得越来越高,越来越远。 #line:001a06f
先改 $h,再调用 kite_state {$h} {$wind} 让缩放/位置连续补间过去(这是玩家能感知到的主要反馈),再叠加一个短促的 kite_accent 强调这次选择的性质。乱度不用每次都传,kite_state 会沿用当前乱度。
4. 离场:kite_hide 或让互斥逻辑自动处理
Day2SleepPresentationController 会监听 SpriteShowcase.PresentationChanging。执行普通 show_sprite、show_large_sprite、hide_* 或通用清理时,会自动停止风筝、轱辘、序列帧与 Tween,因此不必每次手动 kite_hide。只有明确要求“风筝消失但暂不显示别的图”时才需要显式调用。
常见坑
- 忘记补
kite_wind就直接改$wind用于选项判断:$wind变量本身不会驱动画面,画面只认kite_wind/kite_state里传入的wind参数。改了变量务必配一次画面调用,否则玩家看不出风况变了。 - 乱度传太随意:乱度是“文本说乱才乱”,不要在台词写“平稳”“懒洋洋”的段落里传正数乱度,也不要在台词强调失控时仍用默认的 0。
- 以为
kite_state会重置乱度:不会,乱度只由kite_wind改变。如果需要在同一句里既改高度又改乱度,要显式调用两条命令(先kite_wind定乱度,再kite_state走高度)。 - 给风筝以外的图误用
kite_*命令:这套 Rig 硬编码只加载D2S风筝1_风筝层/D2S风筝1_底图,不接受图名参数,不能拿来做别的分层动效——别的分层动效(如轱辘)继续用show_sprite_motion/sprite_motion。