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; }