fix(fix-system): 优化记忆调节接近目标视觉反馈

This commit is contained in:
2026-07-06 14:49:42 +08:00
parent 1b33124ec1
commit 6469a6b746
@@ -13,6 +13,8 @@ namespace AibisDream.FixSystem
[SerializeField] private float defaultValue = 0f;
[SerializeField] private float sliderMaxValue = 6f;
[SerializeField] private float lockThreshold = 0.08f;
[SerializeField] private float nearThreshold = 0.24f;
[SerializeField, Range(0f, 1f)] private float unresolvedVisualFloor = 0.12f;
[SerializeField] private TimelineAsset openAsset;
[SerializeField] private TimelineAsset closeAsset;
@@ -45,7 +47,7 @@ namespace AibisDream.FixSystem
slider.onValueChanged.AddListener(HandleValueChanged);
slider.maxValue = sliderMaxValue;
slider.value = defaultValue;
UpdateVolumeWeight(slider.value);
UpdateTuningOutput(slider.value);
isLocked = true;
SetInteractable(false);
@@ -97,7 +99,7 @@ namespace AibisDream.FixSystem
}
slider.value = 0f;
UpdateVolumeWeight(0f);
UpdateTuningOutput(0f);
PlayTimeline(closeAsset, () =>
{
@@ -108,7 +110,7 @@ namespace AibisDream.FixSystem
private void HandleValueChanged(float value)
{
float t = UpdateVolumeWeight(value);
float t = UpdateTuningOutput(value);
bool wasFound = IsFound;
IsFound = t < lockThreshold;
@@ -119,19 +121,44 @@ namespace AibisDream.FixSystem
OnLost?.Invoke();
}
private float UpdateVolumeWeight(float value)
private float UpdateTuningOutput(float value)
{
float t = GetNormalizedDistance(value);
float visualStrength = GetVisualStrength(t);
if (_volume != null && driveVolume)
_volume.weight = Mathf.Lerp(0, 1, visualStrength);
OnTuningChanged?.Invoke(visualStrength);
return t;
}
private float GetNormalizedDistance(float value)
{
float distance = Mathf.Abs(value - TargetValue);
float maxDistance = Mathf.Max(
Mathf.Abs(slider.maxValue - TargetValue),
Mathf.Abs(slider.minValue - TargetValue)
);
float t = Mathf.Clamp01(distance / maxDistance);
if (_volume != null && driveVolume)
_volume.weight = Mathf.Lerp(0, 1, t);
return Mathf.Clamp01(distance / Mathf.Max(0.0001f, maxDistance));
}
OnTuningChanged?.Invoke(t);
private float GetVisualStrength(float t)
{
float lockBand = Mathf.Clamp01(lockThreshold);
float nearBand = Mathf.Clamp(Mathf.Max(nearThreshold, lockBand + 0.001f), lockBand + 0.001f, 1f);
if (t <= lockBand)
return 0f;
if (t < nearBand)
{
float nearProgress = Mathf.InverseLerp(lockBand, nearBand, t);
float easedProgress = Mathf.SmoothStep(0f, 1f, nearProgress);
return Mathf.Lerp(unresolvedVisualFloor, nearBand, easedProgress);
}
return t;
}