diff --git a/Assets/Scripts/SceneManagement/SpriteShowcase.cs b/Assets/Scripts/SceneManagement/SpriteShowcase.cs
index 02dcc7438..c42f40ed3 100644
--- a/Assets/Scripts/SceneManagement/SpriteShowcase.cs
+++ b/Assets/Scripts/SceneManagement/SpriteShowcase.cs
@@ -16,7 +16,10 @@ namespace AibisDream
private const string DreamSpritePath = "Sprite/梦境/{0}.png";
private const string KiteBaseSuffix = "_底图";
private const string KiteMotionSuffix = "_风筝层";
- private const float ReelMotionSpeedMultiplier = 2f;
+ /// 轱辘拉锯整体倍速;>1 更快。放手抉择前的晃动偏诡异时优先下调这里与位移幅度。
+ private const float ReelMotionSpeedMultiplier = 0.85f;
+ /// 轱辘拉锯位移/旋转幅度倍率。
+ private const float ReelMotionAmplitude = 0.55f;
[SerializeField] private SpriteRenderer _spriteRenderer;
[SerializeField] private SpriteRenderer _backgroundSpriteRenderer;
@@ -442,8 +445,12 @@ namespace AibisDream
// 轱辘:全力拉住——先被拽进受力姿态(只进一次),之后进入拔河式的角力拉锯。
// 拉锯循环见 PlayReelHold。
case "reel_tension":
- 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.Append(tr.DOLocalMove(
+ BaseOffset(0.13f * ReelMotionAmplitude, -0.32f * ReelMotionAmplitude), 0.38f)
+ .SetEase(Ease.OutCubic));
+ seq.Join(tr.DOLocalRotate(
+ new Vector3(0f, 0f, -2.8f * ReelMotionAmplitude), 0.38f)
+ .SetEase(Ease.OutCubic));
seq.OnComplete(() => PlayReelHold(tr));
break;
@@ -466,117 +473,121 @@ namespace AibisDream
{
_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;
+ // 姿态整体随 strain 加深;时长随 strain 略收紧。旋转只做小角度,避免贴图边缘穿帮。
+ // deep*/rotBias 先按原尺度算,最后统一乘 amp,避免叠乘。
+ var amp = ReelMotionAmplitude;
+ var deepX = strain * 0.03f;
+ var deepY = strain * 0.07f;
+ // strain 越高越快,但收紧幅度比原先更克制,避免后期抖得诡异。
+ var speed = Mathf.Lerp(1f, 0.78f, strain);
+ var rotBias = strain * 0.35f;
var seq = DOTween.Sequence();
// 对面加力:被一点点拽深
- var strainDur = UnityEngine.Random.Range(0.35f, 0.6f) * speed;
+ var strainDur = UnityEngine.Random.Range(0.55f, 0.9f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.17f, 0.23f) + deepX,
- UnityEngine.Random.Range(-0.42f, -0.34f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.17f, 0.23f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.42f, -0.34f) - deepY) * amp),
strainDur)
.SetEase(Ease.InOutSine));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-3.6f, -2.4f) - rotBias), strainDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-3.6f, -2.4f) - rotBias) * amp), strainDur)
.SetEase(Ease.InOutSine));
// 猛夺一小截:概率与深度都随 strain 提升;夺完手上发麻——
// 不是连续 shake,而是被向下拽住、短暂停顿,再勉强抬回一点。
- if (UnityEngine.Random.value < 0.55f + strain * 0.35f)
+ if (UnityEngine.Random.value < 0.4f + strain * 0.25f)
{
- var yankDur = UnityEngine.Random.Range(0.1f, 0.16f) * speed;
+ var yankDur = UnityEngine.Random.Range(0.18f, 0.28f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.25f, 0.34f) + deepX,
- UnityEngine.Random.Range(-0.62f, -0.5f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.25f, 0.34f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.62f, -0.5f) - deepY) * amp),
yankDur)
.SetEase(Ease.OutCubic));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-4.8f, -3.4f) - rotBias), yankDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-4.8f, -3.4f) - rotBias) * amp), 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.AppendInterval(UnityEngine.Random.Range(0.1f, 0.18f) * speed);
+ var biteDur = UnityEngine.Random.Range(0.2f, 0.32f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.19f, 0.27f) + deepX,
- UnityEngine.Random.Range(-0.48f, -0.4f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.19f, 0.27f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.48f, -0.4f) - deepY) * amp),
biteDur)
.SetEase(Ease.OutCubic));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-3.4f, -2.2f) - rotBias), biteDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-3.4f, -2.2f) - rotBias) * amp), biteDur)
.SetEase(Ease.OutCubic));
}
// 往回挣(一):咬牙拉回一点
- var recoverDur = UnityEngine.Random.Range(0.16f, 0.24f) * speed;
+ var recoverDur = UnityEngine.Random.Range(0.28f, 0.42f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.12f, 0.16f) + deepX,
- UnityEngine.Random.Range(-0.32f, -0.26f) - deepY * 0.55f),
+ BaseOffset((UnityEngine.Random.Range(0.12f, 0.16f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.32f, -0.26f) - deepY * 0.55f) * amp),
recoverDur)
.SetEase(Ease.OutCubic));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-2.3f, -1.3f) - rotBias * 0.7f), recoverDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-2.3f, -1.3f) - rotBias * 0.7f) * amp), recoverDur)
.SetEase(Ease.OutCubic));
// 滑走半截:手上又被抽走一段
- var slipDur = UnityEngine.Random.Range(0.09f, 0.15f) * speed;
+ var slipDur = UnityEngine.Random.Range(0.16f, 0.26f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.2f, 0.27f) + deepX,
- UnityEngine.Random.Range(-0.5f, -0.4f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.2f, 0.27f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.5f, -0.4f) - deepY) * amp),
slipDur)
.SetEase(Ease.OutQuad));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-4.1f, -2.8f) - rotBias), slipDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-4.1f, -2.8f) - rotBias) * amp), slipDur)
.SetEase(Ease.OutQuad));
- // 四成回合再快速地向下沉半口气又咬住,上下拉锯的小碎步。
- if (UnityEngine.Random.value < 0.45f)
+ // 三成回合再缓缓向下沉半口气又咬住,避免碎步太密显得机械。
+ if (UnityEngine.Random.value < 0.3f)
{
- var dipDur = UnityEngine.Random.Range(0.08f, 0.12f) * speed;
+ var dipDur = UnityEngine.Random.Range(0.14f, 0.22f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.21f, 0.28f) + deepX,
- UnityEngine.Random.Range(-0.56f, -0.47f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.21f, 0.28f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.56f, -0.47f) - deepY) * amp),
dipDur)
.SetEase(Ease.OutQuad));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-4.4f, -3f) - rotBias), dipDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-4.4f, -3f) - rotBias) * amp), dipDur)
.SetEase(Ease.OutQuad));
- var braceDur = UnityEngine.Random.Range(0.11f, 0.16f) * speed;
+ var braceDur = UnityEngine.Random.Range(0.18f, 0.28f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.16f, 0.22f) + deepX,
- UnityEngine.Random.Range(-0.4f, -0.33f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.16f, 0.22f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.4f, -0.33f) - deepY) * amp),
braceDur)
.SetEase(Ease.OutCubic));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-3f, -1.8f) - rotBias), braceDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-3f, -1.8f) - rotBias) * amp), braceDur)
.SetEase(Ease.OutCubic));
}
// 往回挣(二):再咬住,但回不到最初的姿态
- var pullDur = UnityEngine.Random.Range(0.25f, 0.38f) * speed;
+ var pullDur = UnityEngine.Random.Range(0.4f, 0.58f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.13f, 0.18f) + deepX,
- UnityEngine.Random.Range(-0.35f, -0.28f) - deepY * 0.75f),
+ BaseOffset((UnityEngine.Random.Range(0.13f, 0.18f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.35f, -0.28f) - deepY * 0.75f) * amp),
pullDur)
.SetEase(Ease.InOutSine));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-2.8f, -1.6f) - rotBias), pullDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-2.8f, -1.6f) - rotBias) * amp), pullDur)
.SetEase(Ease.InOutSine));
// 偶尔结尾再沉一下,像手腕被拖住,不做高频震动。
- if (UnityEngine.Random.value < 0.35f)
+ if (UnityEngine.Random.value < 0.25f)
{
- var sagDur = UnityEngine.Random.Range(0.12f, 0.2f) * speed;
+ var sagDur = UnityEngine.Random.Range(0.2f, 0.32f) * speed;
seq.Append(tr.DOLocalMove(
- BaseOffset(UnityEngine.Random.Range(0.18f, 0.24f) + deepX,
- UnityEngine.Random.Range(-0.46f, -0.38f) - deepY),
+ BaseOffset((UnityEngine.Random.Range(0.18f, 0.24f) + deepX) * amp,
+ (UnityEngine.Random.Range(-0.46f, -0.38f) - deepY) * amp),
sagDur)
.SetEase(Ease.InOutSine));
seq.Join(tr.DOLocalRotate(
- new Vector3(0f, 0f, UnityEngine.Random.Range(-3.5f, -2.2f) - rotBias), sagDur)
+ new Vector3(0f, 0f, (UnityEngine.Random.Range(-3.5f, -2.2f) - rotBias) * amp), sagDur)
.SetEase(Ease.InOutSine));
}
- seq.OnComplete(() => PlayReelHold(tr, Mathf.Min(1f, strain + 0.22f)));
+ // strain 爬升更慢,后期不会很快进入“狂抖”
+ seq.OnComplete(() => PlayReelHold(tr, Mathf.Min(1f, strain + 0.12f)));
seq.timeScale = ReelMotionSpeedMultiplier;
_smallMotionSequence = seq;
}