Files
aibis-dream/Assets/Scripts/FixSystemNew/BodyModule/CableReel.cs
T

103 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using UnityEngine;
namespace AibisDream.FixSystem
{
public class CableReel : MonoBehaviour
{
[Header("转盘设置")]
[SerializeField] private float torqueStrength = 200f; // 扭矩强度
[SerializeField] private float angularDamping = 5f; // 角速度阻尼
private CablePanel cablePanel;
private float angularVelocity; // 角速度
private float currentAngle; // 当前角度
public Vector3 outletPos { get; private set; } // 出线口位置
private SpriteRenderer spriteRenderer;
private float reelRadius; // 转盘半径
private void Start()
{
// 获取CablePanel引用
cablePanel = transform.GetComponentInParent<CablePanel>();
currentAngle = transform.eulerAngles.z;
// 获取SpriteRenderer并计算半径
spriteRenderer = GetComponent<SpriteRenderer>();
if (spriteRenderer != null)
{
// 使用sprite的bounds来计算半径
reelRadius = spriteRenderer.bounds.extents.y; // 使用y方向的半高作为半径
}
else
{
Debug.LogWarning("CableReel没有SpriteRenderer组件!");
reelRadius = 0.5f; // 默认值
}
// 初始化出线口位置
UpdateOutletPosition();
}
private void UpdateOutletPosition()
{
// 更新出线口位置(圆形本地坐标 (0, -radius) 转成世界坐标)
outletPos = transform.TransformPoint(new Vector3(0, -reelRadius, 0));
}
public void ResetRotation()
{
// 重置角度和角速度
currentAngle = 0;
angularVelocity = 0;
transform.rotation = Quaternion.identity;
UpdateOutletPosition();
}
/// <summary>遗留兼容(旧 CableSystem 场景仍在调用)。</summary>
public void UpdateRotation()
{
if (cablePanel == null || cablePanel.PlugRef == null) return;
UpdateRotation(true);
}
/// <summary>拖拽/插接中朝拉力方向施加扭矩;闲置时缓动回正。</summary>
public void UpdateRotation(bool active)
{
if (cablePanel == null || cablePanel.PlugRef == null) return;
if (!active)
{
angularVelocity = 0f;
currentAngle = Mathf.LerpAngle(currentAngle, 0f, 4f * Time.deltaTime);
transform.rotation = Quaternion.Euler(0, 0, currentAngle);
UpdateOutletPosition();
return;
}
Vector2 center = transform.position;
// 使用当前出线口位置
Vector2 outlet = outletPos;
// 力向量(线缆拉力方向)
Vector2 force = (Vector2)cablePanel.PlugRef.transform.position - outlet;
// 杆臂向量(力作用点相对于圆心的位置)
Vector2 r = outlet - center;
// 计算 2D 扭矩:r × F
float torque = (r.x * force.y - r.y * force.x);
// 应用扭矩 + 阻尼
angularVelocity += torque * torqueStrength * Time.deltaTime;
angularVelocity *= Mathf.Exp(-angularDamping * Time.deltaTime); // 简易阻尼
// 应用旋转
currentAngle += angularVelocity * Time.deltaTime;
transform.rotation = Quaternion.Euler(0, 0, currentAngle);
// 更新出线口位置
UpdateOutletPosition();
}
}
}