안녕하세요 '언리얼로 만들어보는 RPG'의 필자입니다. 작업진도가 생각보다 빠르게 나가지 않는게 필자의 게으름 탓이겠지만 아니라고 믿고싶습니다. 오늘은 퀵슬롯을 만들 예정인데 기존의 구조를 조금 변경해야할 필요성이 있습니다. 또한 Player를 통해서 Slot의 Swap을 해준게 적합한 위치가 아니라 판단되어 다른 클래스에서 처리할 것입니다.


현재 인벤토리는 이런식으로 Slot UI에서 Slotnum를 통해 직접적으로 접근해 갱신하는 형태를 띄고 있습니다. 이 부분은 크게 변경되지 않겠지만 QuickSlot이 생김으로써 인벤토리 배열에 있는 아이템 데이터를 참조하는 Slot이 1:1이 아니게 됩니다. 1:N 의 형태를 띄기 때문에 아이템을 사용했을경우 갱신을 할 다른 방법을 통해야 합니다.


그래서 필자가 떠오른 생각은 ItemData 안에 현재 Data를 참조하고 있는 Slot들의 포인터를 배열로 담아두고 갱신을 할때 배열에 들어와 있는 Slot들을 갱신해주는 형태를 취하려고 합니다. 관련된 디자인 패턴으로는 아마 (&)감시자 패턴이 가장 근접하지 않은가 싶습니다.


<무지개색 총공격이다!>


여전히 Slotnum를 통해서 직접적인 접근을 할 수 있지만 사용후에 갱신을 하는 대상이 하나가 아니라 다수이기 때문에 ItemData에서는 참조중인 Slot들을 배열에 넣어 위 이미지 처럼 관리할 것입니다. 또한 Slotnum은 Data배열과 1:1 대응일 경우를 기반으로 설계되었기 때문에 이제부터는 연결된 배열의 위치를 따로 저장할 Index라는 변수를 만들것 입니다.


대충 계획이 세워졌으니 바로 작업을 시작하도록 하겠습니다.


InGameData.h

USlot*를 담아줄 배열을 선언해주고 함수를 통해서만 접근할 수 있도록 Private영역으로 집어넣었습니다. 해당 배열에 들어있는 Slot들은 정보가 바뀐걸 알려주기만 하면 되기 떄문에 외부에서 접근해 사용할 수 없게 만들었습니다. public 영역의 밑줄친 3개의 함수는 각각 배열에 추가, 삭제를 해줍니다.


InGameData.cpp

<Add · Remove Slot 구현코드>


InGameData.cpp

<아이템 사용후 참조하고있는 Slot들을 갱신한다>


이제 ItemData쪽에서는 갱신해줄 Slot들을 받아서 처리할 준비가 다 되었습니다. 다음으로는 Slot에서 Slotnum과 Index의 작업을 해줘야 합니다.


Slot.h

<Slotnum 역할을 대신할 Index 선언>


Slot.cpp

슬롯의 타입이 Item, Skill때만 Slotnum과 Index를 같게 만들어 줍니다. 왜냐하면 해당 Slot들은 UI에서 Data배열과 1:1로 대응하는 Slot들이기 때문입니다. 이후에는 Slot클래스에서 Slotnum을 이용해 참조하던 부분들을 전부 Index로 바꿔주시면 됩니다.


QuickSlot.h

Slot UI를 담아줄 배열과 기본 채워줄 기본이미지를 가지고 있을 DefTex 변수를 선언해 줍니다. Use함수의 경우 플레이어가 키보드의 숫자를 이용해 퀵슬롯을 사용할때 쓸 함수입니다.


QuickSlot.cpp

초기화의 경우 Inventory와 마찬가지로 Type, Textuer등을 정해주는 방식으로 굴러갑니다. 저 Action함수는 이번 작업을 하면서 필요성에 의해 분리된 것입니다.


Slot.cpp

<Slot에 우클릭을 할경우 작동하던 코드>


Slot.cpp

<QuickSlot에서 부를 수 있도록 분리시켰다>


Slot.cpp

<훨씬 깔끔해진 코드>


BpQuickSlot(UMG 에디터)

위젯 블루프린트를 만들어 아까 C++로 작성한 QuickSlot를 부모로 상속받아서 위처럼 만들어 주시면 됩니다.


GameUI.h

<QuickSlot을 위한 자리를 만들어 주자>


이후에는 여타 다른 UI처럼 Player포인터를 채워주시고 Init함수를 호출해주기만 하면 됩니다.


BpGameUI(UMG 에디터)

<적당한 위치를 잡아준다>


<정상적으로 나오는 QuickSlot>


시간이 너무나 빠르게 흐르는거 같습니다. 앞으로 작성해야할 내용이 꽤나 많이 남아있는데 필자는 벌써 힘이 다 떨어져 버리고 말았습니다. 체력을 좀 회복하고 다음글에서 돌아오도록 하겠습니다.

Posted by 별수집가
,