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 float currentAngle; private Vector3 lastMousePosition; /// /// µå·¡±× °¡´É ¿©ºÎ /// 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); } currentAngle = GetCurrentAngle(); } public void OnDrag() { isDragging = true; lastMousePosition = Input.mousePosition; currentAngle = GetCurrentAngle(); // ÇöÀç } public void OffDrag() { isDragging = false; } public void OnClick() { isRun = true; isDown = !isDown; } private void Update() { if (isDragging) { Vector3 mouseDelta = Input.mousePosition - lastMousePosition; float angleDelta = mouseDelta.y * sensitivity; float newAngle = currentAngle - angleDelta; newAngle = Mathf.Clamp(newAngle, minAngle, maxAngle); ApplyRotation(newAngle); lastMousePosition = Input.mousePosition; currentAngle = newAngle; } 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); } } } private float GetCurrentAngle() { Vector3 currentRotation = transform.localRotation.eulerAngles; float angle = 0f; if (RotationAxis == Axis.forward) angle = currentRotation.z; else if (RotationAxis == Axis.right) angle = currentRotation.x; else if (RotationAxis == Axis.up) angle = currentRotation.y; // -180¿¡¼­ 180 »çÀÌÀÇ °¢µµ·Î º¯È¯ if (angle > 180) angle -= 360; return angle; } private void ApplyRotation(float angle) { Vector3 currentRotation = transform.localRotation.eulerAngles; if (RotationAxis == Axis.forward) currentRotation.z = angle; else if (RotationAxis == Axis.right) currentRotation.x = angle; else if (RotationAxis == Axis.up) currentRotation.y = angle; transform.localRotation = Quaternion.Euler(currentRotation); } }