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); } } } }