152 lines
4.8 KiB
C#

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<CameraControlSystem>();
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;
/// <summary>
/// 현재 어떤 입력 모드도 활성화되지 않았는지 확인합니다.
/// </summary>
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);
}
}