벌써 이 시리즈의 포스팅을 8번째 하는것이지만 언제나 그렇듯이 들어가는 말을 적는게 참 쉽지 않은것 같습니다. 길고 긴 캐릭터 구현이 끝났으니까 다음목표로 인벤토리를 잡았습니다. 크게 어렵지 않으리라 생각했었지만 예상치 못한 복병이 꽤나 있었다는게 뼈아픈 추억이지만 말입니다.


우선 본격적으로 시작하기 전에 UI작업의 갈피를 잡을수 있게 해줬던 튜토리얼 영상입니다. 언리얼 공식 유튜브 채널에 있는것이니 보시면서 참고하실 수도 있으실겁니다. 물론 필자의 경우 C++로 작업하기 때문에 에디터 상에서 UI작업을 어떻게 해야하는지 정도만 참고했습니다.


언제나 그렇듯이 전반적인 작업에 대한 그림을 그려두고 시작을 해야 나중에 할 삽질이 줄어듭니다. 보통 인벤토리를 구현하시는 분들을 보면 아이템에 대한 정보를 UObject를 상속받아서 클래스 형태로 만드는 경우가 많았는데 필자의 경우에는 원하는 바와 좀 달라서 구조체를 이용하기로 했습니다.


구조체를 이용하기로 한 이유가 몇가지 존재하는데

1. 아이템에 대한 정보를 가지고만 있으면 되기 때문에 클래스를 상속받아 쓰지않는 함수나 변수를 가지고 있는것이 마음에 들지 않았습니다.

2. 에디터상에서 아이템 정보를 수정해서 직접 확인할 수 있어야 합니다.


써놓고 보니 별 대단한 이유는 아니었습니다. 그래도 하고싶은대로 해야하지 않겠습니까?

그런 관계로 필자는 구조체를 이용하기로 하였고 상속구조를 통한 다형성을 이용하려고 합니다.


<어떤 타입의 아이템인지 알려줄 Enum>

대충 필요해보이는 것들은 다 집어넣어봤습니다. 이름, UI에 그려질 텍스쳐, 아이템 타입, 몇개를 가지고 있는지, 그리고 가상함수 두개를 만들어서 상속받은 쪽에서 오버라이딩 할 예정입니다. Clear함수는 말그대로정보를 초기화 시켜버리는 용도입니다.


이제 PlayerBase로 가서 FItemData형 배열을 선언해줍니다. 이후에는 에디터에서 잘 작동하는지 한번 확인을 해봐야겠네요


<필자가 원하는대로 된것을 확인할 수 있다>


이제 아이템 데이터를 기반으로 화면에 띄워주는 작업을 하면 되겠군요! 언리얼에서 UI작업을 해본적이 없기에 튜토리얼 영상을 따라서 열심히 만들어 봅니다. 하지만 필자는 C++로 만들어보고 싶어졌습니다.


UserWidget클래스를 상속받아서 내부에 필요한것들을 채워넣어줍니다. Slotnum 변수는 PlayerBase에 있는 인벤토리 배열의 몇번째 인덱스와 연결되어있는지 설정해줄 변수입니다. 나머지의 용도는 보이는 그대로이기 때문에 잘 아시리라 생각하지만 ESlotType이라는 Enum에 대해서 궁금해 하실거 같습니다.


슬롯이라는 UI를 인벤토리, 장비창, 퀵슬롯 등에서도 재사용할 수 있도록 타입에 따른 참조위치를 조절하려는 목적으로 만들었습니다. 언급된 3가지 정도는 만들어야 그럴싸 해보이지 않을까 생각해서 하게 된 것입니다.


이제 문제는 어떻게 C++로 UI에 필요한 위젯들을 생성하느냐였는데 이부분은 열심히 구글신을 통해 검색해서 실마리를 찾게 되었습니다.

https://answers.unrealengine.com/questions/177938/create-umg-button-from-c.html

위의 링크에서 방법을 알아낸 덕분에 저는 순조롭게 코드를 작성하기 시작했습니다.


빨간색 밑줄이 생기기는 하지만 문제없이 돌아가니 걱정하지 않으셔도 됩니다. 라고 말씀드리고 싶었지만 크나큰 문제가 있었습니다. 바로 에디터가 터져버린다는 것입니다. 이유를 예상하건데 위젯을 만들때 생성자 부분에서 만들어내기때문에 터진것 같았습니다.


부모클래스를 뒤져보면서 오버라이딩 할만한 함수를 찾다가 딱 맞아떨어지는듯한 함수를 찾게되었습니다. 이름부터가 초기화에 관련되어있는것이었는데 이거다! 싶은생각에 바로 오버라이딩을 하여서 빌드를 돌려봤더니 터지지 않았습니다.


기쁜 마음으로 여태껏 작성한 클래스를 기반으로 블루프린트를 만들었는데 여기서또다시 한번 막히게 됐습니다. 이유인 즉슨


<필자가 만든 클래스 기반의 블루프린트>

<언리얼의 UMG 에디터>


바로 UMG에디터를 통해서 수정을 할 수 없게되었다는것입니다. 이것도 언리얼을 통해서 UI작업을 해본적이 없다보니까 생긴 문제점중 하나였는데 검색해보니까 위젯 블루프린트를 먼저 생성한 후에 확장을 시켜야 한다고 합니다. 확장이 무슨소리인가 했더니 부모 클래스를 바꿔줄 수 있다는 소리였는데, 이 내용은

https://wiki.unrealengine.com/Extend_UserWidget_for_UMG_Widgets

에서 확인하실 수 있습니다.


<우여곡절 끝에 만들어진 UI>


이렇게 겨우겨우 성공했나 싶었는데 세상에 맙소사 C++로 만들어낸 위젯의 경우 선택도 수정도 무엇하나 되는게 없었습니다. 분명히 화면에 있는데 클릭도 안되고 뭔가 상호작용을 할 수 없었습니다. 이후에도 몇번의 검색과 공식카페에 질문을 통해서 알아낸 바로는 C++에서 만들어낸 위젯은 에디터상에서 조절하는 방법을 아는사람이 없었고 현재로써는 코드로 만들어 사용하는건 전혀 불필요한 작업이었다는것으로 판명났습니다.


<필자의 기분을 매우 잘 나타내는 그림>


별로 작성한것도 없는것 같은데 벌써 시간이 많이 흘렀습니다. 네 그렇습니다 이번 포스팅은 여기까지 마무리 하고서 힘을 재충전하고 다음포스팅때 돌아오도록 하겠습니다.

Posted by 별수집가
,