자기개발/UE5

[UE5.1] 위젯과 ChatGPT

KGW2027 2023. 2. 22. 22:50
728x90
반응형

  Unreal Engine을 공부하면서 가장 불편한 점은, 내가 영어를 아주 못한다는 것이다.

ChatGPT에 대해서는 작년 11월즈음부터 알고있었으나, 그냥 장난감식으로 생각하고있었는데

차세대 검색엔진같은 말이 하도 나오니 구글링대신 ChatGPT를 사용해볼까? 하는 생각이 들어 바로 시도해봤다.

 


 먼저, Construction Script에서 Data Table을 ConstructorHelper::FObjectFinder로 불러온 후에 FindRow를 실행했는데,

이렇게 할 경우 DataTable을 변경/저장 한 뒤, 컴파일을 하더라도 최초 컴파일 당시의 DataTable 상태를 호출한다.

대충 원인은 어딘가에 ObjectPtr의 형태로 캐싱되어 있어서, 그걸 새로고침하지 못하고 계속 복사하고 있다.. 라고 생각했다.

 이런 방법을 선택한 이유는 당시에는 ConstructorHelper 외의 방법으로 BlueprintClass를 가져오는 방법을 알지 못했기 때문에, ConstructorHelper를 사용할 수 있는 생성자에서 모든걸 수행하려고 했다.

 그래서 현재 내 코드와 함께 ChatGPT에게 해결방법을 제시해보라고 했다.

 2,3번 해결방법이 유효한지는 잘 모르겠지만, 일단 1번 방법인 런타임 로드가 유효해보였고, 시도해보지 않은 방법이었기 때문에 해당 방법의 자세한 정보를 요청했다.

 위아래에 별로 중요하지 않은 내용들은 모두 치우고, 이렇게 FSoftObjectPath를 사용해 Blueprint Class를 Runtime에 가져오는 방법을 알게 되었고, 이를 사용해 문제를 해결했다.

 


 

FSoftClassPath : 런타임에 블루프린트 클래스를 가져온다. (TryLoadClass() 사용)

FSoftObjectPath : 런타임에 블루프린트 오브젝트를 가져온다. (TryLoad() 사용)

 

 


 이 다음으로는 Widget을 Viewport에 띄워놨을 때, 마우스 사용에 관한 것이었다.

PlayerController->SetShowMouseCursor()를 이용하면 마우스가 보이게 하는 것은 가능하지만,

이 상태에서도 마우스를 클릭한 상태로 마우스를 움직이면 플레이어 컨트롤러에(?) 입력이 간다.

이로 인해 위젯에서 드래그를 구현하려고 할 때, 드래그에 따라 플레이어의 화면이 같이 움직이게 된다.

 

 그래서 컨트롤러가 키보드 입력만 받고 마우스 입력은 받지않게 하는 방법이 필요했다.

 처음에는 UIOnly에서 키보드만 입력받게 하는 방법에 대해 생각했는데,

GameAndUI 상태에서 마우스를 입력받지 않게하는 것이 더 쉬울 수 있겠다는 생각이 들었다.

 그래서 이에 대한 것도 질문해봤지만, 하려고하는 액션에 비해 너무 과한 자원이 들어가는 해결법을 추천해줬다.

대체 어떻게 해야하나.. 생각하는데 Output Log를 보니 InputMode가 변경될때마다 올라오는 로그가 있었다.

 여기서 UI를 열 때는 MouseCaptureMode가 DuringMouseDown으로 변경되고,

닫을때는 Permanetly로 변하는 것을 확인했다.

그래서 이 부분을 수동적으로 변경할 수 있다면 문제 상황을 해결할 수 있을거라고 생각했다.

그리고, 이 방법에 대해 ChatGPT에게 질문해봤다.

 

 FViewport라는 구조체를 가져와서 SetViewportMouseCaptureMode를 사용하면 된다는 솔루션이었다.

바로 해당 방법을 시도해봤지만, Viewport에는 이런 함수가 존재하지 않았다.

그래서 답변이 UE4로 되어있길래 5.1에서 사용가능한 코드로 변환하라고 해봤다.

 

Viewport까지 가지않고, ViewportClient에서 수행하는 방법이었다.

GetViewportClient()는 존재하지 않았지만, ViewportClient 변수에 직접접근이 가능했고,

Controller->GetLocalPlayer()->ViewportClient->SetMouseCaptureMode()를 이용할 수 있었다.

 

그래서 마우스를 사용하는 위젯을 열때는

UWidgetBlueprintLibrary::SetInputMode_GameAndUIEx(Controller);
Controller->SetShowMouseCursor(true);
Controller->GetLocalPlayer()->ViewportClient->SetMouseCaptureMode(EMouseCaptureMode::NoCapture);

를 사용해서,

InputMode를 Game과 UI에서 동시에 받게한 후, Mouse가 보이게 하고, Viewport에서는 마우스 입력을 받지 않도록 했다.

 

그리고 이 위젯이 닫힐때는

UWidgetBlueprintLibrary::SetInputMode_GameOnly(Controller);
Controller->SetShowMouseCursor(false);
Controller->GetLocalPlayer()->ViewportClient->SetMouseCaptureMode(EMouseCaptureMode::CapturePermanently);

를 사용해서,

InputMode를 Game만 받게하고, Mouse를 숨기고, Viewport가 Mouse입력을 반드시 받도록했다.

 

 


 ChatGPT를 통해 문제를 해결하는 것이 생각보다 효율이 괜찮다는 생각이 들었다.

어느정도 문제에 대해 파악하고 있어야 정확한 질문을 통해 정확한 답변을 받을 수 있다는 점이 단점이지만,

뭐 이것은 구글링을 할 때도 질문 애매하게 적었을 때 원하는 답변이 나오기 힘드니 마찬가지인 것 같다.

대충 'ChatGPT에 질문->구글링->구글링해서 나온 정보를 바탕으로 다시 ChatGPT..' 이걸 반복하면 되지 않을까?

 

딥러닝쪽도 좀 공부를 해두긴 해야 하는데, 할려면 게임을 하는 시간을 아예 없애야 하는데

하루 3-4시간이라도 게임을 안하면 스트레스가 마구마구 쌓여버려서 힘들것 같아 큰일이다..

이제 곧 개강이라 시간이 더 없을텐데...

728x90
반응형