fix(fix-system): 修正线盘松弛预判朝向与绷紧判定

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-27 22:48:10 +08:00
co-authored by Cursor
parent bc4475ae66
commit 65735dec52
3 changed files with 18 additions and 13 deletions
@@ -92,10 +92,11 @@ namespace AibisDream.FixSystem
return;
}
// 线缆还有余量时不驱动转盘,避免"还没拉紧就先转"
// 松弛时不驱动转盘,并缓动回正,避免出线口对着插头“预判”朝向
if (tautness <= 0f)
{
angularVelocity *= Mathf.Exp(-angularDamping * Time.deltaTime);
angularVelocity = 0f;
currentAngle = Mathf.LerpAngle(currentAngle, 0f, returnSpeed * Time.deltaTime);
ApplyRotation();
return;
}
@@ -96,16 +96,21 @@ public class PhysicCable : MonoBehaviour
public float CurrentLength => _length;
/// <summary>0=完全松弛,1=绷直。线盘只在真正拉紧后才应转动。</summary>
public float GetTautness(float slackMargin = 0.35f)
/// <summary>
/// 0=完全松弛,1=绷直。已扣除送线故意留的余量(1.04×直线距 + lengthMargin),
/// 避免「有设计余量就永远不转」;线盘只在真正被拽时才应转动。
/// </summary>
public float GetTautness(float extraSlackMargin = 0.2f)
{
if (State != CableState.Dragging && State != CableState.Plugged) return 0f;
if (_pts == null || startTransform == null) return 0f;
float straightDist = Vector3.Distance(startTransform.position, FlattenZ(EndPosition));
float slack = _length - straightDist;
if (slack >= slackMargin) return 0f;
return 1f - Mathf.Clamp01(slack / slackMargin);
float baselineLength = straightDist * 1.04f + lengthMargin;
float extraSlack = _length - baselineLength;
if (extraSlack >= extraSlackMargin) return 0f;
if (extraSlack <= 0f) return 1f;
return 1f - extraSlack / extraSlackMargin;
}
private struct Particle
@@ -199,15 +199,14 @@ namespace AibisDream.FixSystem
private void Update()
{
// 拖拽/插接时转盘朝插头方向转动,闲置时缓动回正
// 不再要求线缆完全绷紧,否则送线会让 tautness 长时间为 0,视觉上看不到旋转。
// 拖拽时由拉力驱动出线口倾斜;插接/松弛不预判朝向插头
// GetTautness 已扣除送线设计余量,绷紧时才会转。
if (CableReelRef != null && physicCableRef != null
&& physicCableRef.State != PhysicCable.CableState.Hidden)
{
bool active = physicCableRef.State == PhysicCable.CableState.Dragging
|| physicCableRef.State == PhysicCable.CableState.Plugged
|| physicCableRef.State == PhysicCable.CableState.Collapsing;
CableReelRef.UpdateRotation(active);
bool active = physicCableRef.State == PhysicCable.CableState.Dragging;
float tautness = active ? physicCableRef.GetTautness() : 0f;
CableReelRef.UpdateRotation(active, tautness);
}
}