using UnityEngine; using DG.Tweening; namespace Interaction { public class LeverController : MonoBehaviour, IInteractable { [Header("组件设置")] [Tooltip("拉杆的旋转部分")] [SerializeField] private Transform leverTransform; [Header("角度设置 (局部 Z轴)")] [SerializeField] private float onAngle = 40f; [SerializeField] private float offAngle = -40f; [Header("动画设置")] [SerializeField] private float duration = 1.0f; [SerializeField] private Ease animationEase = Ease.OutQuad; // 运行时状态 private bool isOn = false; private void Start() { if (leverTransform == null) { Debug.LogError("[LeverController] 未赋值 Lever Transform!请在 Inspector 中设置。"); return; } // 1. 获取当前局部旋转 (Z轴) float currentZ = leverTransform.localEulerAngles.z; // 2. 角度标准化 (-180 到 180) if (currentZ > 180) currentZ -= 360; // 3. 初始状态判断 (谁近选谁) float distToOn = Mathf.Abs(Mathf.DeltaAngle(currentZ, onAngle)); float distToOff = Mathf.Abs(Mathf.DeltaAngle(currentZ, offAngle)); isOn = distToOn < distToOff; Debug.Log($"[Lever] 初始化完成 | 当前角度: {currentZ:F1} | 判定状态: {(isOn ? "开启 (On)" : "关闭 (Off)")}"); } public void Interact() { if (leverTransform == null) return; Debug.Log($"[Lever] 交互触发 | 切换前状态: {isOn}"); ToggleLever(); } public void ToggleLever() { isOn = !isOn; // 目标角度 float targetZ = isOn ? onAngle : offAngle; // 构造目标旋转 (保持 X, Y 为 0,仅旋转 Z) // 注意:如果你希望保留当前的 X/Y 倾斜,请改用: // new Vector3(leverTransform.localEulerAngles.x, leverTransform.localEulerAngles.y, targetZ); Vector3 targetRotation = new Vector3(0, 0, targetZ); // 动画执行 leverTransform.DOKill(); // 停止旧动画 leverTransform.DOLocalRotate(targetRotation, duration) .SetEase(animationEase); } /// /// 获取当前交互提示文本 /// public string GetInteractPrompt() { return isOn ? "关闭拉杆" : "开启拉杆"; } } }