안녕하세요 '언리얼로 만들어보는 RPG'의 필자입니다. 이번 글에서는 QuickSlot 사용을 위한 플레이어의 입력처리와 저번 글에서 언급한 Drag&Drop에 관련된 함수의 위치를 변경할 것입니다.


작업을 시작하기에 앞서 필자는 QucikSlot을 최대 8개로 만들어 두었고 입력을 Action Mapping을 이용해서 하려 했습니다. 다만 한가지 문제점이 있었는데 필자가 알고 있는 한계에서는 Action Mapping을 통한 (&)Bind Action에는 값이 들어오지 않는다는 것이었습니다.


몇번의 검색을 통해서 해결방법을 알아냈는데 Bind Action에 (&)Delegate함수를 Bind 시킬 수 있다는 것이었습니다. 자세한 내용은 아래의 출처를 따라가 보시면 됩니다.


프로젝트 셋팅(입력)

<QuickSlot 사용을 위한 준비 나머지도 똑같다>


PlayerBase.h

int변수 하나를 받는 Delegate 하나와 실질적으로 사용될 함수 UseQuickSlot함수를 선언합니다.


PlayerBase.cpp

<BindAction의 Delegate 연결과 UseQuickSlot함수 코드>


이후에는 GameUI를 타고 내려가 QuickSlot UI에서 함수를 호출해 사용할 수 있게 합니다.


GameUI.cpp


QuickSlot.cpp

플레이어의 입력준비를 다 해놨으니까 이제 Drag&Drop 부분을 변경할 시간입니다.


PlayerBase를 거쳐서 작업했던 부분들을 다 삭제합니다.

ㄴ GameUI::void RefreshInventory

ㄴ PlayerBase::DraggingSwap

ㄴ PlayerBase::SwapInven


SlotDrag.h

<대격변이 일어난 Slog DragDropOperation>


Drag&Drop과 관련된 코드가 PlayerBase를 거쳐가는게 매우 이상했습니다. Drag&Drop을 할때 사용하는 클래스가 있는데도 불구하고 그런다는건 더더욱 이상한 일이지요. 그래서 다 옮겨버렸습니다. 옮기는김에 구조도 좀 바꾸었구요.


여전히 Player를 통해 Inventory 배열에는 접근해야 하기 때문에 Player포인터를 가지고 있습니다. 또 저번에는 Slotnum과 Type을 저장했었는데 Index라는 별도의 변수가 생기고 구조가 바뀌면서 Slot 자체를 받아오기로 했습니다.


SlotDrag.cpp

Drop함수는 저번 PlayerBase에 있던 DraggingSwap함수와 같은 기능을 합니다. Drag를 시작한 Slot과 Drop한 Slot의 type을 확인하여 어떤 동작을 할지 정해주는 분기함수입니다.


SlotDrag.cpp

<저번과 크게 달라지지 않은 SwapInven>


SlotDrag.cpp

현재는 Inventory 뿐이기 때문에 다른 경우는 작성해 두지 않았습니다. 만일 Drop한 Slot의 Type이 Q_Item일 경우 이미 해당 QuickSlot에 다른 Item이 들어가 있는것이기 때문에 참조중인 ItemData에서 해당 Slot을 제거해줍니다. 이후에는 Drag한 Slot과 연결된 ItemData의 참조중 목록에 추가해주고 Type과 Index를 지정해주고 갱신해줍니다.


이제 작업한 코드가 잘 작동하는지 테스트를 해볼 시간입니다.


<아이템을 옮기자 갱신이 안되는 문제가 생겼다>


어째서 이러한지 이유를 알기위해서 열심히 디버그도 해보고 머리도 굴려봤습니다. 결론부터 말씀드리자면 우선 아이템 사용후 갱신하는 방식을 바꿔서 그렇습니다. Inventory의 Slot UI는 ItemData 배열과 1:1로 대응하기 때문에 ItemDate를 Swap하면 ReferenceSlots 또한 바뀌어서 그렇습니다.


<이해를 돕기위한 이미지>


위의 이미지처럼 Inventory UI에서는 Slot이 가지고 있는 Index를 통해서 Inventory 배열에 접근해서 아이템을 사용하는데 Swap후에는 갱신해야할 Slot UI 목록이 바뀌어서 그런것입니다.


InGameData.cpp

해당 문제를 해결하기 위해서 Slot목록을 담은 배열만 바꿔주는 함수를 작성했습니다.


SlotDrag.cpp

Inventory 배열의 정보를 Swap해준 다음에 방금 만들어준 SwapReference함수를 불러줍니다.


<아이템을 옮겨도 Inventory UI는 잘 작동하지만...>


네 이번에는 QuickSlot쪽에서 다시 문제가 생겼습니다. 좀 문제점을 찾아본 결과 아까와 같은 맥락의 ItemData를 참조하고 있는 Slot들에 대한 갱신 문제였습니다. Inventory UI의 Slot은 Inventory 배열과 1:1 대응이지만 QuickSlot의 경우 1:1 대응이 아니기 때문에 ItemData를 참조중인 QuickSlot은 여전히 그 목록에 있어야 하는것입니다.


이번 글이 너무 길어지는 것 같아서 다음 포스팅에서 이어 작성하도록 하겠습니다. 분량조절 하는건 쉽지 않은것 같습니다.

Posted by 별수집가
,