🎮Unreal4/C++_Plugin

[UE4] Command 명령어-2 : Window창 띄우기 (SWindow, SVerticalBox, SNew, MainFrameModule, FConsoleCommandWithArgsDelegate, ParseIntoArray)

공대 컴린이 2023. 3. 24. 21:24
728x90

이전 학습에서는 명령어의 기능으로 간단한 Log를 출력해보았으니

이번에는 명령어를 입력하면 새로운 Window 창을 띄우고 창 안에 내용들을 출력할 수 있는 기능을 구현해보았다.

🚩 Slate 위젯으로 만든 Window 창 띄우기

Console Command의 델리게이트에 등록해두었던 OpenWindow 함수를 수정하여 구현했다.

 

스마트 포인터 TSharedRef를 이용하여 SWindowSVerticalBox를 각각 생성하였다.

위젯을 만들때 사용하던 Border, Text 등등이 하나하나 위젯인데, Slate에서도 똑같이 위젯을 사용한다. 이때 사용되는 위젯들 앞에는 S를 접두사로 붙인다. 따라서 위젯명이 SWindow와 SVerticalBox이다.

Slate는 언리얼 엔진4에서 제공되는 커스텀 유저 인터페이스 프레임워크이다.

 

Slate동적할당을 하는 방법이 SNew SAsignNew 두 가지가 있다.

나는 SWindow와 SVerticalBox를 둘다 SNew로 생성하였다. SNew로 객체를 생성하면 생성된 객체를 바로 Return 시켜주기 때문에 SNew() 함수 뒤에 바로 . 으로 진입하여 해당 객체를 사용할 수 있다.

이렇게 생성과 동시에 접근하는 방식이 재귀적 용법이다.

💡 SWindow 생성

위 코드에서 SWindow를 초기화하는 부분을 보면 SNew(SWindow) 소스코드 밑으로 .Title, .ClientSize, .SupportsMaximize 등등 window에 대한 설정이 쭉 이어나가는것을 볼 수 있다.

ClientSize는 window 창의 크기를 설정하고, SupportsMinmize는 창의 최소화 기능의 On/Off 설정이고, Maximize는 최대화 기능을 설정한다.

Content의 설명을 보면 FArguments들을 넣어 윈도우 창에 들어갈 위젯들을 설정할 수있는데, FArguments로 되어있는 것들은 모두 배열로 정의할 수 있다. 따라서 Content() [ box ]; 와 같은 형식으로 값을 전달해주었다.

💡 SVerticalBox 생성

boxSVerticalBox의 객체로  Vertical 방향으로 되어있는 Grid 패널 개념이다.

SVerticalBox는 칸 하나, 즉 한 줄을 Slot이라고 불러 AddSlot() 함수를 통해 내용을 추가할 수 있다.

AutoHeight()로 자동 높이를 조절하도록 설정하였고, [ ] 배열은 SWindow와 동일하게 Content 내용을 초기화하는 부분이다.

SNew로 간단한 Text를 출력하기위한 STextBlock을 생성하여 Text를 지정해주었다.

💡 MainFrameModule 생성

이렇게 SWindow와 그 내용 SVerticalBox의 초기화가 끝났다면 디자인을 완료한 것이고, 이제는 디자인을 실제로 보여줄 IMainFrameModule을 생성하였다.

 

언리얼은 전체가 모듈의 집합으로 이루어져있는데, 이러한 모듈 하나하나를 ModuleManager를 통해 접근할 수 있다.

 

언리얼 엔진의 기본 창을 보면 엔진 자체의 Main 창 위에 액터배치, 출력로그, 월드아웃라이너, 디테일패널 등등의 모듈이 하나하나 올라가져 있는 것이다.

이때 엔진 자체의 Main창 (쉽게 생각하면 밑판)이 바로 MainFrameModule 이고, 이것이 창을 띄우며 관리한다.

 

SWindow를 띄우기 위해 FModuleManager LoadModuleChecked 함수를 호출하였는데, LoadModuleChecked 함수는 다룰 수 있는 각 창의 이름과 자료형이 매칭되어있다.

 

여기에 IMainFrameModule을 입력하여 main frame을 초기화하였고, AddWindowAsNativeChild 함수를 통해 main frame 위에 window가 위치하도록 설정하고 FSlateApplication AddWindow 함수로 window를 띄워주었다.

 

성공적으로 Console Command Window 창이 떴다 !

🚩 Window 창안에 들어갈 내용(Arguments) 전달하기

Window 창을 성공적으로 띄웠으니 이제 안에 출력될 내용들을 전달해주었다.

 

기존의 델리게이트는 Args를 전달받지 않는 델리게이트였다.

따라서 FConsoleCommandWithArgsDelegate를 새로 생성하여 command2 라는 변수명으로 저장한 뒤, BindLambda 함수를 통해 람다식으로 델리게이트가 실행될 때 수행할 기능들을 구현하였다.

 

람다식의 문법이나 사용방법들은 새로운 게시글 하나로 간략히 정리해두었다.

2023.03.24 - [Unreal4/C++] - [UE4] 람다식(Lambda), capture절

간단히 설명하자면 외부 변수를 참조하여 사용한다는 의미 [&] 의 캡처절을 작성하였다.

이후 매개변수const TArray<FString>& InArgs 를 받기 위해 (  ) 의 Argument 구역에 매개변수를 작성하였다.

 

델리게이트의 내용으로는 SWindow에 출력할 FString들을 초기화하는 내용들을 작성하였다.

매개변수 개수를 저장하고 게임모드인지를 저장하고 매개변수로 받은 FString 내용을 순서대로 저장한 뒤, OpenWindow 함수를 실행시키며 매개변수로 저장한 FString을 보내주었다.

 

이때 FString의 " || " 문자열을 작성할 때 자주 사용하지 않는 문자이기 때문에  문자열을 구분해주는 역할로 (살짝 암묵적 룰) 작성해주었다.

 

이후 IConsoleCommand* 형식의 두번째 변수인 OpenWindowArgsCommand를 선언하였고 IConsoleManager의 RegisterConsoleCommand 함수를 통해 "TestCommandArgs"라는 Command 명령어를 생성하고, 명령어가 작동될 때 실행될 델리게이트 command2를 등록해주었다.

 

OpenWindow 함수에서는 매개변수로 받은 FString(InString) 변수를 ParseIntoArray 함수를 통해 "||"를 기준으로 나눠 TArray에 저장하였다.

 

완성된 프로그램을 실행시키면 명령어 목록에 TestCommandArgs 명령어가 새롭게 추가된 것을 확인할 수 있고,

 

명령어 뒤에 매개변수로 문자열 아무거나 입력한 뒤 보내면 FString으로 매개변수가 전달되어 SWindow 내용이 출력된다.

 


TestCommandArgs 만 입력 TestCommandArgs a b c d e f g 입력

 


참조

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/Slate/Overview/

 

슬레이트 개요

크로스 플랫폼 Slate UI 프레임워크에 대한 개요입니다.

docs.unrealengine.com

728x90