feat(scene-mgmt): 放缓轱辘拉锯幅度与节奏
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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>轱辘拉锯整体倍速;>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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user