팀프로젝트, 팀프로젝트 GDD작성
UMG 입력 이벤트는 위젯이 직접 받는 마우스 입력이다.
EnhancedInput처럼 Input Action을 만들어서 받는 게 아니라, 화면에 떠 있는 UserWidget이 마우스 클릭, 이동, 해제를 직접 처리한다.
그래서 무기 프리뷰 회전은 마우스 매핑을 안 해도 동작할 수 있다.
NativeOnMouseButtonDown은 위젯 위에서 마우스 버튼을 눌렀을 때 호출 되는 함수다.
이 함수에서는 보통 드래그 시작 조건을 검사한다. 현재 진행 프로젝트에서는 왼쪽 마우스인가?, 프리뷰 영역 안에서 눌렀는가?를 체크했다.
둘다 true면 드래그를 시작한다. 마우스 누름 -> 조건 확인 -> 드래그 시작
마우스가 움직일 때 호출되는 함수다.
하지만 마우스가 움직인다고 무조건 무기를 돌리면 안 된다. 그래서 bIsDraggingPreview같은 값으로 현재 드래그 ㅇ중인지 확인한다.
마우스 버튼을 뗐을 때 호출되는 함수이다.
드래그 기능에서는 종료 처리 역할
bIsDraggingPreview = false-> 마우스 캡처 해제 마우스 입력 정보가 들어 있는 객체다.
마우스 버튼, 현재 위치, 이동량 같은 저옵가 들어 있다.
GetEffectingButton() -> 이번 이벤트를 발생시킨 마우스 버튼을 가져온다.GetCursorDelta() -> 이전 이벤트 이후 마우스가 얼마나 움직였는지 가져온다.GetScreenSpacePoisiton() -> 현재 마우스의 화면 좌표를 가져온다.UMG/Slate 마우스 이벤트 함수가 반환하는 입력 처리 결과이다.
위에서 설명한 NativeOnMouse 함수들은 마지막에 FReply를 반환한다
FReply::Handled()FReply::Unhandled()위젯의 실제 화면상 배치 정보
이 UI가 화면에서 어디에 있고, 얼마나 크고, 어떤 스케일로 배치되어 있는지에 대한 정보다
1920x1080에서 표시하는 UI가 1280x920이면 달라질 수 있기때문에 깨질 가능성이 크다. 그래서 Unreal이 계산해둔 실제 배치 정보인 FGeometry를 사용하는 것이다.
previewDragArea가 현재 화면에서 실제로 어디에 있고, 얼마나 큰지 계산된 정보를 가져온다.
Cached라는 말이 붙은 이유는, UMG/Slate가 레이아웃 계산 결과를 저장해두기 때문이다. UI는 매 프레임 배치 계산을 거쳐 화면에 그려진다.
위치, 크기, 스케일, 부모 기준 변환, 화면 기준 변환 가져오는게 GetCachedGeometry()다.
부모 클래스의 NativeOnMouseButtonDown 함수를 호출하고, 그 함수가 반환한 FReply를 그대로 반환한다.
if (InMouseEvent.GetEffectingButton() != EKeys::LeftMouseButton)
{
return Super::NativeOnMouseButtonDown(InGeometry, InMouseEvent);
}
이렇게 사용하는데 이건
" 왼쪽 마우스가 아니면 내 무기 프리뷰 드래그 로직은 실행하지 않는다. 대신
UUserWidget의 기본 마우스 처리 흐름에 맡긴다."
즉 다른키가 할당되어있으면 그걸로 쓰라는 뜻 return FReply::Unhandled();대신 retrun Super::Nat..을 쓰는 이유는 커스텀 기본 로직에서는 처리 하지 않지만 부모 클래스나 블루프린트 기본 이벤트가 처리할 수도 있으니 그쪽을 실행해보라는뜻
그래서 보통 오버라이드 함수에서 내가 처리하지 않는 경우에
Super를 호출하는 습관이 좋다.
특히 UMG에서는 블루프린트 이벤트와 연결될 수 있어서 더더욱 그래야함.
마우스를 이 위젯이 계속 붙잡게 하는 기능이다.
마우스를 누른 뒤 커서가 프리뷰 영역 밖으로 나가도, 계속 MouseMove와 MouseButtonUp을 받아야 한다. 그렇지 않으면 영역 밖으로 나갔을때 회전이 멈춰 불쾌하다.
MouseButtonDown중에 그래서 bIsDragging을 두고 MouseButtonUp을 하지 못하게 하는 것
현재 마우스 위치가 아니라 이동량이다.
이전 위치 -> 현재 위치
까지 그 사이에 얼마나 움직였는가?를 표시한다.
사용 방법
마우스를 오른쪽으로 움직임
-> Delta.X 증가
-> 무기 Yaw 회전
이래서 드래그 회전에 GetCursorDelta()를 쓴다. 나머지 Y도 똑같이 움직이면 된다.
특정 화면 좌표가 이 UI 영역 안에 있는지 검사하는 함수
previewGeometry.IsUnderLocation(mouseScreenPosition);
이걸로 프리뷰 영역 안에서 클릭했을 때만 드래그 시작하게 만든다.