using UnityEngine;
using UnityEngine.InputSystem.Controls;
public class LeverController : MonoBehaviour
{
public enum Axis
{
forward,
right,
up,
}
public Axis RotationAxis;
public float maxAngle = 45f; // ·¹¹öÀÇ ÃÖ´ë °¢µµ
public float minAngle = -45f; // ·¹¹öÀÇ ÃÖ¼Ò °¢µµ
public float sensitivity = 0.2f; // ¸¶¿ì½º ¿òÁ÷ÀÓ¿¡ ´ëÇÑ ¹Î°¨µµ
private Vector3 rotationAxis; // ȸÀüÃà (±âº»°ª: XÃà)
///
/// µå·¡±× °¡´É ¿©ºÎ
///
private bool isDragging = false;
///
/// ·¹¹ö°¡ ¹Ø¿¡ ÀÖ´ÂÁö ¾Æ·¡ÀÖ´ÂÁö ÆÇ´Ü
///
private bool isDown = false;
private bool isRun = false;
private float startMouseY;
private float startAngle;
private int layerMask;
private float time = 0;
private Quaternion downTargetRos;
private Quaternion upTargetRos;
private float speed = 10;
private void Start()
{
Quaternion q = transform.localRotation;
layerMask = 1 << LayerMask.NameToLayer("Train");
if (RotationAxis == Axis.forward)
{
rotationAxis = Vector3.forward;
downTargetRos = q * Quaternion.Euler(0,0, maxAngle);
upTargetRos =q * Quaternion.Euler(0, 0, minAngle);
}
else if (RotationAxis == Axis.right)
{
rotationAxis = Vector3.right;
downTargetRos = q * Quaternion.Euler(maxAngle, 0, 0);
upTargetRos = q * Quaternion.Euler(minAngle, 0, 0);
}
else if (RotationAxis == Axis.up)
{
rotationAxis = Vector3.up;
downTargetRos = q * Quaternion.Euler(0, maxAngle, 0);
upTargetRos = q * Quaternion.Euler(0, minAngle, 0);
}
}
public void OnDrag()
{
isDragging = true;
startMouseY = Input.mousePosition.y;
startAngle = transform.localRotation.eulerAngles.z;
if (startAngle > 180) startAngle -= 360; // -180¿¡¼ 180 »çÀÌÀÇ °¢µµ·Î º¯È¯
}
public void OffDrag()
{
isDragging = false;
}
public void OnClick()
{
isRun = true;
isDown = !isDown;
}
private void Update()
{
if (isDragging)
{
float mouseDelta = Input.mousePosition.y - startMouseY;
float newAngle = startAngle - mouseDelta * sensitivity;
// ·¹¹öÀÇ °¢µµ¸¦ Á¦ÇÑµÈ ¹üÀ§ ³»·Î Á¶Á¤
newAngle = Mathf.Clamp(newAngle, minAngle, maxAngle);
Vector3 currentRotation = transform.localRotation.eulerAngles;
if (RotationAxis == Axis.forward)
{
currentRotation.z = newAngle;
}
else if (RotationAxis == Axis.right)
{
currentRotation.x = newAngle;
}
else if (RotationAxis == Axis.up)
{
currentRotation.y = newAngle;
}
// »õ·Î¿î ȸÀü Àû¿ë
transform.localRotation = Quaternion.Euler(currentRotation);
}
if (isRun)
{
time = Time.deltaTime * speed;
if (isDown)
{
transform.localRotation = Quaternion.Slerp(transform.localRotation, upTargetRos,time );
}
else
{
transform.localRotation = Quaternion.Slerp(transform.localRotation, downTargetRos, time);
}
}
}
}