feat(scene-mgmt): 放缓轱辘拉锯幅度与节奏

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-21 01:20:13 +08:00
co-authored by Cursor
parent 845f46b924
commit 98dfb644c5
@@ -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;
/// <summary>轱辘拉锯整体倍速;&gt;1 更快。放手抉择前的晃动偏诡异时优先下调这里与位移幅度。</summary>
private const float ReelMotionSpeedMultiplier = 0.85f;
/// <summary>轱辘拉锯位移/旋转幅度倍率。</summary>
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;
}