Initial Unity project commit

This commit is contained in:
2026-07-08 19:53:15 +08:00
commit 75f254212e
15657 changed files with 11633879 additions and 0 deletions
@@ -0,0 +1,80 @@
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 ? "关闭拉杆" : "开启拉杆";
}
}
}