81 lines
2.6 KiB
C#
81 lines
2.6 KiB
C#
|
|
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($"<color=green>[Lever] 交互触发 | 切换前状态: {isOn}</color>");
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取当前交互提示文本
|
||
|
|
/// </summary>
|
||
|
|
public string GetInteractPrompt()
|
||
|
|
{
|
||
|
|
return isOn ? "关闭拉杆" : "开启拉杆";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|