diff --git a/Assets/Scripts/SceneManagement/SpriteShowcase.cs b/Assets/Scripts/SceneManagement/SpriteShowcase.cs
index c19bc3faa..d387ca1c5 100644
--- a/Assets/Scripts/SceneManagement/SpriteShowcase.cs
+++ b/Assets/Scripts/SceneManagement/SpriteShowcase.cs
@@ -202,26 +202,12 @@ namespace AibisDream
switch (profile)
{
- // 轱辘:持续拉扯里的几次失控顿挫。单向循环,避免 Yoyo 反放造成“被倒带”的怪感。
+ // 轱辘:全力拉住——先被拽进受力姿态(只进一次),之后进入拔河式的角力拉锯。
+ // 拉锯循环见 PlayReelHold。
case "reel_tension":
- seq.Append(tr.DOLocalMove(BaseOffset(0.03f, -0.05f), 0.28f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -1.5f), 0.28f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(BaseOffset(0.13f, -0.18f), 0.16f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -4.8f), 0.16f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(BaseOffset(0.08f, -0.11f), 0.48f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -2.4f), 0.48f).SetEase(Ease.InOutSine));
- seq.AppendInterval(0.12f);
- seq.Append(tr.DOLocalMove(BaseOffset(0.19f, -0.25f), 0.13f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -6.5f), 0.13f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(BaseOffset(0.11f, -0.15f), 0.62f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -3.2f), 0.62f).SetEase(Ease.InOutSine));
- seq.AppendInterval(0.2f);
- seq.Append(tr.DOLocalMove(BaseOffset(0.15f, -0.21f), 0.18f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -5.2f), 0.18f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(BaseOffset(0.06f, -0.09f), 0.75f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -2f), 0.75f).SetEase(Ease.InOutSine));
- seq.AppendInterval(0.18f);
- seq.SetLoops(-1, LoopType.Restart);
+ seq.Append(tr.DOLocalMove(BaseOffset(0.13f, -0.32f), 0.22f).SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -2.8f), 0.22f).SetEase(Ease.OutCubic));
+ seq.OnComplete(() => PlayReelHold(tr));
break;
default:
@@ -232,6 +218,130 @@ namespace AibisDream
_smallMotionSequence = seq;
}
+ ///
+ /// 轱辘“拔河角力”常驻循环:一场正在输掉的拔河。
+ /// strain 随回合递增(0→1):节奏越来越快、姿态被拽得越来越深、猛夺越来越频繁;
+ /// 往回挣不再是平滑回弹,而是“向下被拖住→抬回一点→又沉下去→再咬住”的三段拉锯。
+ /// 每回合参数随机,OnComplete 续下一回合;用纵向位移和停顿表达强拉,避免机械抖动。
+ ///
+ private void PlayReelHold(Transform tr, float strain = 0f)
+ {
+ _smallMotionSequence?.Kill();
+
+ // 姿态整体随 strain 加深;时长随 strain 收紧。旋转只做小角度,避免贴图边缘穿帮。
+ var deepX = strain * 0.06f;
+ var deepY = strain * 0.14f;
+ var speed = Mathf.Lerp(1f, 0.62f, strain);
+ var rotBias = strain * 0.8f;
+
+ var seq = DOTween.Sequence();
+
+ // 对面加力:被一点点拽深
+ var strainDur = UnityEngine.Random.Range(0.35f, 0.6f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.17f, 0.23f) + deepX,
+ UnityEngine.Random.Range(-0.42f, -0.34f) - deepY),
+ strainDur)
+ .SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-3.6f, -2.4f) - rotBias), strainDur)
+ .SetEase(Ease.InOutSine));
+
+ // 猛夺一小截:概率与深度都随 strain 提升;夺完手上发麻——
+ // 不是连续 shake,而是被向下拽住、短暂停顿,再勉强抬回一点。
+ if (UnityEngine.Random.value < 0.55f + strain * 0.35f)
+ {
+ var yankDur = UnityEngine.Random.Range(0.1f, 0.16f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.25f, 0.34f) + deepX,
+ UnityEngine.Random.Range(-0.62f, -0.5f) - deepY),
+ yankDur)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-4.8f, -3.4f) - rotBias), yankDur)
+ .SetEase(Ease.OutCubic));
+ seq.AppendInterval(UnityEngine.Random.Range(0.05f, 0.11f) * speed);
+ var biteDur = UnityEngine.Random.Range(0.12f, 0.2f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.19f, 0.27f) + deepX,
+ UnityEngine.Random.Range(-0.48f, -0.4f) - deepY),
+ biteDur)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-3.4f, -2.2f) - rotBias), biteDur)
+ .SetEase(Ease.OutCubic));
+ }
+
+ // 往回挣(一):咬牙拉回一点
+ var recoverDur = UnityEngine.Random.Range(0.16f, 0.24f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.12f, 0.16f) + deepX,
+ UnityEngine.Random.Range(-0.32f, -0.26f) - deepY * 0.55f),
+ recoverDur)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-2.3f, -1.3f) - rotBias * 0.7f), recoverDur)
+ .SetEase(Ease.OutCubic));
+ // 滑走半截:手上又被抽走一段
+ var slipDur = UnityEngine.Random.Range(0.09f, 0.15f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.2f, 0.27f) + deepX,
+ UnityEngine.Random.Range(-0.5f, -0.4f) - deepY),
+ slipDur)
+ .SetEase(Ease.OutQuad));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-4.1f, -2.8f) - rotBias), slipDur)
+ .SetEase(Ease.OutQuad));
+ // 四成回合再快速地向下沉半口气又咬住,上下拉锯的小碎步。
+ if (UnityEngine.Random.value < 0.45f)
+ {
+ var dipDur = UnityEngine.Random.Range(0.08f, 0.12f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.21f, 0.28f) + deepX,
+ UnityEngine.Random.Range(-0.56f, -0.47f) - deepY),
+ dipDur)
+ .SetEase(Ease.OutQuad));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-4.4f, -3f) - rotBias), dipDur)
+ .SetEase(Ease.OutQuad));
+ var braceDur = UnityEngine.Random.Range(0.11f, 0.16f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.16f, 0.22f) + deepX,
+ UnityEngine.Random.Range(-0.4f, -0.33f) - deepY),
+ braceDur)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-3f, -1.8f) - rotBias), braceDur)
+ .SetEase(Ease.OutCubic));
+ }
+ // 往回挣(二):再咬住,但回不到最初的姿态
+ var pullDur = UnityEngine.Random.Range(0.25f, 0.38f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.13f, 0.18f) + deepX,
+ UnityEngine.Random.Range(-0.35f, -0.28f) - deepY * 0.75f),
+ pullDur)
+ .SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-2.8f, -1.6f) - rotBias), pullDur)
+ .SetEase(Ease.InOutSine));
+ // 偶尔结尾再沉一下,像手腕被拖住,不做高频震动。
+ if (UnityEngine.Random.value < 0.35f)
+ {
+ var sagDur = UnityEngine.Random.Range(0.12f, 0.2f) * speed;
+ seq.Append(tr.DOLocalMove(
+ BaseOffset(UnityEngine.Random.Range(0.18f, 0.24f) + deepX,
+ UnityEngine.Random.Range(-0.46f, -0.38f) - deepY),
+ sagDur)
+ .SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, UnityEngine.Random.Range(-3.5f, -2.2f) - rotBias), sagDur)
+ .SetEase(Ease.InOutSine));
+ }
+
+ seq.OnComplete(() => PlayReelHold(tr, Mathf.Min(1f, strain + 0.22f)));
+ _smallMotionSequence = seq;
+ }
+
public void PlayCurrentMotion(string motionProfile)
{
if (_spriteRenderer == null || !IsSmallShowing) return;
@@ -481,7 +591,6 @@ namespace AibisDream
private DG.Tweening.Sequence _kiteSwaySequence;
private DG.Tweening.Sequence _kiteAccentSequence;
private Tween _kiteFadeTween;
- private Tween _kiteBaseFadeTween;
private float _kiteHeight;
/// 当前乱度 0~1,由 kite_wind 显式设定;kite_state 沿用上次的值(粘滞)。
private float _kiteTurbulence;
@@ -559,8 +668,6 @@ namespace AibisDream
_kiteAccentSequence = null;
_kiteFadeTween?.Kill();
_kiteFadeTween = null;
- _kiteBaseFadeTween?.Kill();
- _kiteBaseFadeTween = null;
}
private void ApplyKiteStateImmediate(float height)
@@ -579,7 +686,7 @@ namespace AibisDream
///
/// 风筝高度(对应 Yarn 变量 $h)
/// 风向(对应 Yarn 变量 $wind:1 强 / 0 无 / -1 弱)
- /// 淡入时长
+ /// 保留参数以兼容既有调用;出现不再淡入,仅用于互斥隐藏其它图
public IEnumerator ShowKite(float height, int wind, float duration = 0.35f)
{
if (IsLargeShowing)
@@ -633,9 +740,9 @@ namespace AibisDream
_kiteTurbulence = 0f;
PlayKiteSway(wind);
- _kiteBaseFadeTween = _kiteBaseRenderer.DOFade(1f, duration);
- _kiteFadeTween = _kiteRenderer.DOFade(KiteAlpha(height), duration);
- yield return _kiteFadeTween.WaitForCompletion();
+ // 不做淡入:背景是硬切的,风筝单独 fade 反而突兀,直接以目标透明度出现
+ _kiteBaseRenderer.SetAlpha(1f);
+ _kiteRenderer.SetAlpha(KiteAlpha(height));
}
///
@@ -670,80 +777,150 @@ namespace AibisDream
PlayKiteSway(wind);
}
+ /// 屏幕可读性补偿:高度层缩小时适度放大局部位移(开方衰减),避免远处几乎不动。
+ private float KiteSwayComp() =>
+ Mathf.Clamp(1f / Mathf.Sqrt(KiteScaleFactor(_kiteHeight)), 1f, 3f);
+
///
/// 常驻风况循环。位移在高度层的子空间里会随缩放变小,用 comp 做部分补偿保证远处仍有可读的移动。
- /// 平稳(乱度 0):大而缓的漫游位移,自由自在地飘,绝不抖。
- /// 乱流(乱度 >0):一阵一阵——静一下,猛地被拽走一截(位移+旋转),慢慢荡回来,再来一阵。
+ /// 平稳(乱度 0):沿 CatmullRom 曲线大而缓地漫游,绝不抖。
+ /// 乱流(乱度 >0):转交 ,每一阵的方向、力度、间隔都随机。
///
private void PlayKiteSway(int wind)
{
_kiteSwaySequence?.Kill();
_kiteSwaySequence = null;
- var tr = _kiteSwayPivot;
- var storm = _kiteTurbulence;
- // 屏幕可读性补偿:高度层缩小时适度放大局部位移(开方衰减),避免远处几乎不动
- var comp = Mathf.Clamp(1f / Mathf.Sqrt(KiteScaleFactor(_kiteHeight)), 1f, 2.2f);
- var seq = DOTween.Sequence();
- var loopType = LoopType.Yoyo;
-
- if (wind > 0 && storm > 0.01f)
+ if (wind > 0 && _kiteTurbulence > 0.01f)
{
- // 乱流:先被阵风突然带走,再慢慢回撑;间隔不等,让“失控”读出来但不变成抖屏。
- loopType = LoopType.Restart;
- var amp = comp * (0.95f + storm * 0.95f);
- seq.AppendInterval(Mathf.Lerp(0.35f, 0.12f, storm));
- seq.Append(tr.DOLocalMove(new Vector3(0.46f, 0.08f, 0f) * amp, 0.22f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -13f - storm * 8f), 0.22f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(new Vector3(0.2f, -0.08f, 0f) * amp, 0.95f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 5f + storm * 2f), 0.95f).SetEase(Ease.InOutSine));
- seq.AppendInterval(0.08f);
- seq.Append(tr.DOLocalMove(new Vector3(-0.3f, 0.16f, 0f) * amp, 0.18f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 12f + storm * 7f), 0.18f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(new Vector3(-0.04f, 0.02f, 0f) * amp, 0.72f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -2f), 0.72f).SetEase(Ease.InOutSine));
- seq.AppendInterval(Mathf.Lerp(0.28f, 0.08f, storm));
- seq.Append(tr.DOLocalMove(new Vector3(0.36f, 0.2f, 0f) * amp, 0.16f).SetEase(Ease.OutCubic));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -10f - storm * 5f), 0.16f).SetEase(Ease.OutCubic));
- seq.Append(tr.DOLocalMove(new Vector3(0.1f, 0.04f, 0f) * amp, 1.05f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 2f), 1.05f).SetEase(Ease.InOutSine));
+ PlayKiteGust();
+ return;
}
- else if (wind > 0)
+
+ var tr = _kiteSwayPivot;
+ var comp = KiteSwayComp();
+ // 幅度随高度补偿放大后,周期也同步拉长:漂移更明显,但速度不变快,保持轻松
+ var drift = 1f + (comp - 1f) * 0.4f;
+ var seq = DOTween.Sequence();
+
+ if (wind > 0)
{
- // 稳定的风:顶着风侧倾,大幅度缓慢巡游(位移为主,平稳无抖)
- seq.Append(tr.DOLocalMove(new Vector3(0.3f, 0.18f, 0f) * comp, 2.6f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -7f), 2.6f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(new Vector3(0.42f, 0.06f, 0f) * comp, 2.2f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -4f), 2.2f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(new Vector3(0.12f, 0.12f, 0f) * comp, 2.8f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -8.5f), 2.8f).SetEase(Ease.InOutSine));
+ // 稳定的风:顶着风侧倾,沿弧线缓慢巡游(位移为主,平稳无抖)
+ var path = new[]
+ {
+ new Vector3(0.26f, 0.15f, 0f) * comp,
+ new Vector3(0.46f, 0.05f, 0f) * comp,
+ new Vector3(0.33f, 0.24f, 0f) * comp,
+ new Vector3(0.11f, 0.11f, 0f) * comp,
+ };
+ var dur = 9.2f * drift;
+ seq.Append(tr.DOLocalPath(path, dur, PathType.CatmullRom).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -7.5f), dur / 4f).SetEase(Ease.InOutSine)
+ .SetLoops(4, LoopType.Yoyo));
}
else if (wind == 0)
{
- // 平稳无风:自由自在地漫游,大而缓的位移
- seq.Append(tr.DOLocalMove(new Vector3(0.26f, 0.14f, 0f) * comp, 3.2f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 4f), 3.2f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(new Vector3(-0.2f, 0.24f, 0f) * comp, 3.6f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -4.5f), 3.6f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(new Vector3(-0.3f, 0.04f, 0f) * comp, 3f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 3f), 3f).SetEase(Ease.InOutSine));
+ // 平稳无风:自由自在地沿曲线漫游,幅度加大、节奏放缓
+ var path = new[]
+ {
+ new Vector3(0.3f, 0.16f, 0f) * comp,
+ new Vector3(0.08f, 0.36f, 0f) * comp,
+ new Vector3(-0.28f, 0.24f, 0f) * comp,
+ new Vector3(-0.38f, 0.03f, 0f) * comp,
+ };
+ var dur = 12f * drift;
+ seq.Append(tr.DOLocalPath(path, dur, PathType.CatmullRom).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 4f), dur / 4f).SetEase(Ease.InOutSine)
+ .SetLoops(4, LoopType.Yoyo));
}
else
{
- // 风弱:缓慢的下坠漂移
- seq.Append(tr.DOLocalMove(new Vector3(0.08f, -0.22f, 0f) * comp, 2.6f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 3.5f), 2.6f).SetEase(Ease.InOutSine));
- seq.Append(tr.DOLocalMove(new Vector3(-0.14f, -0.1f, 0f) * comp, 2.2f).SetEase(Ease.InOutSine));
- seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -2f), 2.2f).SetEase(Ease.InOutSine));
+ // 风弱:沿弧线缓缓向下飘
+ var path = new[]
+ {
+ new Vector3(0.12f, -0.14f, 0f) * comp,
+ new Vector3(0.03f, -0.28f, 0f) * comp,
+ new Vector3(-0.17f, -0.21f, 0f) * comp,
+ };
+ var dur = 7.8f * drift;
+ seq.Append(tr.DOLocalPath(path, dur, PathType.CatmullRom).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 3f), dur / 3f).SetEase(Ease.InOutSine)
+ .SetLoops(3, LoopType.Yoyo));
}
- seq.SetLoops(-1, loopType);
+ seq.SetLoops(-1, LoopType.Yoyo);
+ _kiteSwaySequence = seq;
+ }
+
+ ///
+ /// 单次阵风,播完通过 OnComplete 用一组新的随机参数接下一阵——节奏永不重复。
+ /// 猛拽段 X 快、Y 慢半拍(不同时长+缓动),走出弧线而不是直线。
+ /// 乱度越高越狂:间隔与荡回时间大幅压缩、拽得更快更斜,
+ /// 甩过头弹回之外,还有概率来不及回稳就被反向再抽一鞭。
+ ///
+ private void PlayKiteGust()
+ {
+ if (!IsKiteShowing) return;
+
+ _kiteSwaySequence?.Kill();
+
+ var tr = _kiteSwayPivot;
+ var storm = _kiteTurbulence;
+ var amp = KiteSwayComp() * (1f + storm * 1.15f);
+ // 高乱度整体提速:猛拽更快、几乎没有喘息
+ var frantic = Mathf.Lerp(1f, 0.7f, storm);
+
+ // 阵风方向:多数顺着主风向,偶尔反向兜一下;上下随机
+ var side = UnityEngine.Random.value < 0.72f ? 1f : -1f;
+ var jerk = new Vector3(
+ UnityEngine.Random.Range(0.34f, 0.58f) * side,
+ UnityEngine.Random.Range(-0.1f, 0.3f),
+ 0f) * amp;
+ var jerkDur = UnityEngine.Random.Range(0.14f, 0.26f) * frantic;
+ var rot = (14f + storm * 18f) * UnityEngine.Random.Range(0.7f, 1.15f) * -side;
+ var settle = jerk * UnityEngine.Random.Range(0.15f, 0.4f);
+ var settleDur = UnityEngine.Random.Range(0.7f, 1.2f) * Mathf.Lerp(1f, 0.45f, storm);
+ var rest = Mathf.Lerp(
+ UnityEngine.Random.Range(0.35f, 0.75f),
+ UnityEngine.Random.Range(0.02f, 0.1f),
+ storm);
+
+ var seq = DOTween.Sequence();
+ seq.AppendInterval(rest);
+ // 猛地被拽走:X 快 Y 慢,轨迹成弧
+ seq.Append(tr.DOLocalMoveX(jerk.x, jerkDur).SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalMoveY(jerk.y, jerkDur * UnityEngine.Random.Range(1.4f, 1.9f)).SetEase(Ease.OutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, rot), jerkDur * 1.2f).SetEase(Ease.OutCubic));
+ // 失控:甩过头再弹回来一下
+ if (storm > 0.7f && UnityEngine.Random.value < 0.6f)
+ {
+ seq.Append(tr.DOLocalRotate(new Vector3(0f, 0f, -rot * 0.65f), 0.22f).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalMoveX(jerk.x * 0.7f, 0.22f).SetEase(Ease.InOutSine));
+ }
+ // 更失控:来不及回稳,就被反方向再抽一鞭
+ if (storm > 0.6f && UnityEngine.Random.value < 0.5f)
+ {
+ var whipDur = UnityEngine.Random.Range(0.12f, 0.2f);
+ seq.Append(tr.DOLocalMoveX(-jerk.x * UnityEngine.Random.Range(0.5f, 0.9f), whipDur)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalMoveY(UnityEngine.Random.Range(-0.16f, 0.2f) * amp, whipDur * 1.5f)
+ .SetEase(Ease.OutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -rot * UnityEngine.Random.Range(0.7f, 1.1f)), whipDur * 1.3f)
+ .SetEase(Ease.OutCubic));
+ }
+ // 荡回来(X/Y 不同步 → 回程也是弧线;高乱度下这一步也短促)
+ seq.Append(tr.DOLocalMoveX(settle.x, settleDur).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalMoveY(settle.y, settleDur * UnityEngine.Random.Range(0.7f, 0.95f)).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, rot * UnityEngine.Random.Range(-0.3f, 0.15f)), settleDur)
+ .SetEase(Ease.InOutSine));
+ seq.OnComplete(PlayKiteGust);
_kiteSwaySequence = seq;
}
///
/// 一次性顿挫动效,叠加在 Accent 层上,结束回到原位,不打断高度/风况补间。
- /// 支持:lift(上冲回落)/ sink(下坠沉降)/ taut(前扯抖动)/ drop(猛地下坠)/ flutter(原地挣扎扑腾)。
+ /// 支持:lift(上冲回落)/ sink(下坠沉降)/ taut(前扯抖动)/ drop(猛地下坠)/ flutter(原地挣扎扑腾)
+ /// / wrench(侧面兜住猛甩,最强档)。
///
public void PlayKiteAccent(string profile)
{
@@ -782,6 +959,20 @@ namespace AibisDream
seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 7f), 0.55f).SetEase(Ease.InQuad));
break;
+ // 侧面兜住(最强档,切轱辘前用):先被回带半拍蓄力,随即狠狠横甩出去,
+ // 挣了一下没挣回来,又被兜得更远、倾得更狠——位移远超其它档位
+ case "wrench":
+ seq.Append(tr.DOLocalMove(new Vector3(-0.11f, 0.04f, 0f), 0.09f).SetEase(Ease.OutQuad));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, 4f), 0.09f).SetEase(Ease.OutQuad));
+ seq.Append(tr.DOLocalMove(new Vector3(0.7f, 0.2f, 0f), 0.16f).SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -24f), 0.16f).SetEase(Ease.OutCubic));
+ seq.Append(tr.DOLocalMove(new Vector3(0.45f, 0.09f, 0f), 0.2f).SetEase(Ease.InOutSine));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -10f), 0.2f).SetEase(Ease.InOutSine));
+ seq.Append(tr.DOLocalMove(new Vector3(0.92f, 0.3f, 0f), 0.15f).SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(new Vector3(0f, 0f, -30f), 0.15f).SetEase(Ease.OutCubic));
+ seq.AppendInterval(0.25f);
+ break;
+
// 挣扎:左右交替的几下小拉扯,力度递减
case "flutter":
seq.Append(tr.DOLocalMove(new Vector3(0.1f, 0.14f, 0f), 0.2f).SetEase(Ease.OutCubic));
@@ -804,26 +995,17 @@ namespace AibisDream
}
///
- /// 隐藏风筝 Rig
+ /// 隐藏风筝 Rig。与显示一致不做淡出,直接消失(过渡由外层屏幕 fade 承担)。
///
- /// 淡出时长
+ /// 保留参数以兼容既有调用,实际忽略
public IEnumerator HideKite(float duration = 1)
{
if (!IsKiteShowing) yield break;
KillKiteTweens();
- if (duration <= 0f)
- {
- _kiteRenderer.SetAlpha(0);
- _kiteBaseRenderer.SetAlpha(0);
- }
- else
- {
- _kiteBaseFadeTween = _kiteBaseRenderer.DOFade(0, duration);
- _kiteFadeTween = _kiteRenderer.DOFade(0, duration);
- yield return _kiteFadeTween.WaitForCompletion();
- }
+ _kiteRenderer.SetAlpha(0);
+ _kiteBaseRenderer.SetAlpha(0);
_kiteRootPivot.gameObject.SetActive(false);
_kiteBaseRenderer.gameObject.SetActive(false);