using UnityEngine; public class InputHandler : MonoBehaviour { private Vector2 lastMousePosition; private float lastScrollValue; private bool isRightMouseHeld; private bool isMiddleMouseHeld; private bool isOrbitActive; private bool isZoomActive; private bool isCtrlRightZoomActive; // 현재 활성화된 입력 모드 (충돌 방지) private InputMode currentMode = InputMode.None; private enum InputMode { None, Orbit, // Alt + 우클릭 또는 Alt + 좌클릭 Zoom, // Ctrl + 좌클릭 CtrlRightZoom, // Ctrl + 우클릭 Rotation, // 우클릭 Pan // 휠클릭 } // 카메라 컨트롤 시스템 참조 private CameraControlSystem cameraControlSystem; private void Start() { // CameraControlSystem 찾기 cameraControlSystem = FindAnyObjectByType(); if (cameraControlSystem == null) { Debug.LogWarning("[InputHandler] CameraControlSystem을 찾을 수 없습니다."); } } private void Update() { // 마우스 버튼 Raw 상태 bool leftMouse = Input.GetMouseButton(0); bool rightMouse = Input.GetMouseButton(1); bool middleMouse = Input.GetMouseButton(2); bool altKey = Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt); bool ctrlKey = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); // 모든 마우스 버튼이 해제되면 모드 리셋 if (!leftMouse && !rightMouse && !middleMouse) { currentMode = InputMode.None; } // 입력 우선순위에 따라 모드 결정 (이미 활성화된 모드가 없을 때만) if (currentMode == InputMode.None) { if (altKey && (rightMouse || leftMouse)) { currentMode = InputMode.Orbit; } else if (ctrlKey && rightMouse) { currentMode = InputMode.CtrlRightZoom; } else if (ctrlKey && leftMouse) { currentMode = InputMode.Zoom; } else if (rightMouse) { currentMode = InputMode.Rotation; } else if (middleMouse) { currentMode = InputMode.Pan; } } // 현재 모드에 따라 상태 설정 isOrbitActive = (currentMode == InputMode.Orbit) && (rightMouse || leftMouse) && altKey; isZoomActive = (currentMode == InputMode.Zoom) && leftMouse && ctrlKey; isCtrlRightZoomActive = (currentMode == InputMode.CtrlRightZoom) && rightMouse && ctrlKey; isRightMouseHeld = (currentMode == InputMode.Rotation) && rightMouse; isMiddleMouseHeld = (currentMode == InputMode.Pan) && middleMouse; // 모드가 해제되면 None으로 전환 if (currentMode == InputMode.Orbit && ((!rightMouse && !leftMouse) || !altKey)) { currentMode = InputMode.None; } else if (currentMode == InputMode.CtrlRightZoom && (!rightMouse || !ctrlKey)) { currentMode = InputMode.None; } else if (currentMode == InputMode.Zoom && (!leftMouse || !ctrlKey)) { currentMode = InputMode.None; } else if (currentMode == InputMode.Rotation && !rightMouse) { currentMode = InputMode.None; } else if (currentMode == InputMode.Pan && !middleMouse) { currentMode = InputMode.None; } // 마우스 위치 업데이트 lastMousePosition = Input.mousePosition; lastScrollValue = Input.mouseScrollDelta.y; } public bool IsRightMouseHeld() => isRightMouseHeld; public bool IsMiddleMouseHeld() => isMiddleMouseHeld; public bool IsOrbitActive() => isOrbitActive; public bool IsZoomActive() => isZoomActive; public bool IsCtrlRightZoomActive() => isCtrlRightZoomActive; /// /// 현재 어떤 입력 모드도 활성화되지 않았는지 확인합니다. /// public bool IsIdle() => currentMode == InputMode.None; public Vector2 GetLookDelta() { return new Vector2( Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y") ); } public float GetZoomDelta() { return Input.mouseScrollDelta.y; } public Vector2 GetMousePosition() { return Input.mousePosition; } // 카메라 컨트롤 시스템 관련 메서드들 public CameraControlSystem GetCameraControlSystem() { return cameraControlSystem; } public bool IsFunctionKeyPressed(KeyCode keyCode) { return Input.GetKeyDown(keyCode); } }