2026-05-11(월) NativeOnMouse, FReply, FGeometry , CaptureMouse

조범근·2026년 5월 11일

TIL

목록 보기
57/81

C++ Week 11

Study

팀프로젝트, 팀프로젝트 GDD작성



Today I Learned


UnrealC++

1. UMG 입력 이벤트

UMG 입력 이벤트는 위젯이 직접 받는 마우스 입력이다.

EnhancedInput처럼 Input Action을 만들어서 받는 게 아니라, 화면에 떠 있는 UserWidget이 마우스 클릭, 이동, 해제를 직접 처리한다.

그래서 무기 프리뷰 회전은 마우스 매핑을 안 해도 동작할 수 있다.



2. NativeOnMouse

2-1. NativeOnMouseButtonDown

NativeOnMouseButtonDown위젯 위에서 마우스 버튼을 눌렀을 때 호출 되는 함수다.

이 함수에서는 보통 드래그 시작 조건을 검사한다. 현재 진행 프로젝트에서는 왼쪽 마우스인가?, 프리뷰 영역 안에서 눌렀는가?를 체크했다.

둘다 true면 드래그를 시작한다. 마우스 누름 -> 조건 확인 -> 드래그 시작

2-2. NativeOnMouseMove

마우스가 움직일 때 호출되는 함수다.

하지만 마우스가 움직인다고 무조건 무기를 돌리면 안 된다. 그래서 bIsDraggingPreview같은 값으로 현재 드래그 ㅇ중인지 확인한다.

  • 드래그 중이면 -> 마우스 이동량 읽기 -> 무기 회전 요청
  • 드래그 중이 아니면 -> 아무것도 실행 안됨.

2-3. NativeOnMouseButtonUp

마우스 버튼을 뗐을 때 호출되는 함수이다.

드래그 기능에서는 종료 처리 역할

  • 마우스 뗌 -> 드래그 상태 해제 = bIsDraggingPreview = false-> 마우스 캡처 해제

2-4. FPointerEvent

마우스 입력 정보가 들어 있는 객체다.

마우스 버튼, 현재 위치, 이동량 같은 저옵가 들어 있다.

  • GetEffectingButton() -> 이번 이벤트를 발생시킨 마우스 버튼을 가져온다.
  • GetCursorDelta() -> 이전 이벤트 이후 마우스가 얼마나 움직였는지 가져온다.
  • GetScreenSpacePoisiton() -> 현재 마우스의 화면 좌표를 가져온다.


3. FReply, FGeometry

3-1. FReply

UMG/Slate 마우스 이벤트 함수가 반환하는 입력 처리 결과이다.
위에서 설명한 NativeOnMouse 함수들은 마지막에 FReply를 반환한다

  • FReply::Handled()
    -> 이 입력은 이곳에서 처리했고 다른 곳에서 처리할 필요 없다.
  • FReply::Unhandled()
    -> 이 입력은 이곳에서 처리하지않았고 다른 곳에서 처리해라

3-2. FGeometry

위젯의 실제 화면상 배치 정보

이 UI가 화면에서 어디에 있고, 얼마나 크고, 어떤 스케일로 배치되어 있는지에 대한 정보다

왜 FGeometry가 필요할까

1920x1080에서 표시하는 UI가 1280x920이면 달라질 수 있기때문에 깨질 가능성이 크다. 그래서 Unreal이 계산해둔 실제 배치 정보인 FGeometry를 사용하는 것이다.

GetCachedGeometry()

previewDragArea가 현재 화면에서 실제로 어디에 있고, 얼마나 큰지 계산된 정보를 가져온다.

Cached라는 말이 붙은 이유는, UMG/Slate가 레이아웃 계산 결과를 저장해두기 때문이다. UI는 매 프레임 배치 계산을 거쳐 화면에 그려진다.

위치, 크기, 스케일, 부모 기준 변환, 화면 기준 변환 가져오는게 GetCachedGeometry()다.

3-3. return Super::NativeOnMouseButtonDown(...)

부모 클래스의 NativeOnMouseButtonDown 함수를 호출하고, 그 함수가 반환한 FReply를 그대로 반환한다.

그럼 부모 기본 처리는 뭘 할까

if (InMouseEvent.GetEffectingButton() != EKeys::LeftMouseButton)
{
    return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
}

이렇게 사용하는데 이건

" 왼쪽 마우스가 아니면 내 무기 프리뷰 드래그 로직은 실행하지 않는다. 대신 UUserWidget의 기본 마우스 처리 흐름에 맡긴다."

즉 다른키가 할당되어있으면 그걸로 쓰라는 뜻 return FReply::Unhandled();대신 retrun Super::Nat..을 쓰는 이유는 커스텀 기본 로직에서는 처리 하지 않지만 부모 클래스나 블루프린트 기본 이벤트가 처리할 수도 있으니 그쪽을 실행해보라는뜻

그래서 보통 오버라이드 함수에서 내가 처리하지 않는 경우에 Super를 호출하는 습관이 좋다.

특히 UMG에서는 블루프린트 이벤트와 연결될 수 있어서 더더욱 그래야함.



4. CaptureMouse

마우스를 이 위젯이 계속 붙잡게 하는 기능이다.

마우스를 누른 뒤 커서가 프리뷰 영역 밖으로 나가도, 계속 MouseMoveMouseButtonUp을 받아야 한다. 그렇지 않으면 영역 밖으로 나갔을때 회전이 멈춰 불쾌하다.

MouseButtonDown중에 그래서 bIsDragging을 두고 MouseButtonUp을 하지 못하게 하는 것

  • 드래그 시작 -> CaptureMouse -> 영역 밖으로 나가도 계속 입력 받음
  • 드래그 종료 -> ReleaseMouseCapture


5. GetCursorDelta

현재 마우스 위치가 아니라 이동량이다.

이전 위치 -> 현재 위치
까지 그 사이에 얼마나 움직였는가?를 표시한다.

사용 방법
마우스를 오른쪽으로 움직임
-> Delta.X 증가
-> 무기 Yaw 회전

이래서 드래그 회전에 GetCursorDelta()를 쓴다. 나머지 Y도 똑같이 움직이면 된다.



6. IsUnderLocation

특정 화면 좌표가 이 UI 영역 안에 있는지 검사하는 함수

previewGeometry.IsUnderLocation(mouseScreenPosition);

이걸로 프리뷰 영역 안에서 클릭했을 때만 드래그 시작하게 만든다.

0개의 댓글