안녕하세요 '언리얼로 만들어보는 RPG'의 필자입니다. 저번글에 이어서 QuickSlot이 갱신되지 않는 문제를 해결하기위해 바로 들어가도록 하겠습니다.


<저번과 동일한 문제>


<문제 해결을 위한 방법>


위 이미지 처럼 ReferenceSlots 배열을 Swap해 준다음에 QuickSlot들만 다시 옮겨줘야 하는것입니다. 그래야 갱신이 정상적으로 이루어지기 때문이지요. 이제 방법을 알아냈으니까 코드를 작성해봅니다.


InGameData.cpp

필자가 생각해도 깔끔한 방법은 아니지만 별다른 좋은방법이 떠오르지 않아서 이런식으로 처리하게 되었습니다. Drag를 시작한 슬롯과 Drop한 슬롯으로부터 Index를 받아오고 이를 통해 두 ItemData가 가지고 있던 참조중인 Slot 목록에서 Type이 Q_Item인 것들만 따로 골라낸후 다시 넣어주는 방식을 취했습니다. 뭔가 더 좋은 방법이 있는거 같으시면 필자에게 알려주세요!


SlotDrag.cpp

<변경된 함수에 맞춰서 인자를 넣어준다>


<아이템을 옮겨도 QuickSlot도 잘 갱신이 된다>


이제 Inventory 내의 ItemData를 옮김으로써 생기는 문제들을 해결했습니다. 다음으로 해야할 작업은 QuickSlot 끼리의 Swap처리를 해주어야 하는데요. 이건 그렇게 어렵지 않을것 같았습니다. 네 '같았었습니다' 참조중인 Slot 목록에서 빼고 넣어주기만 하면 될 줄 알았는데 생각만큼 쉽지 않았던 작업이었던거 같습니다.


SlotDtag.cpp

저번 글에서 학인하지 않았던 SwapQuickSlot 함수입니다. Drag를 시작한 Slot의 Type이 Q_Item일 경우에 대해서만 작성해 두었으며 Drop한 Slot의 Type이 Q_Item일 경우 이미 참조중인 ItemData가 있는것이기에 서로 참조중인 ItemData가 가진 목록에서 추가, 삭제를 하도록 했습니다.


그다음에 필자의 경우 goto문을 이용해서 작업을 처리하는데 생소한분들이 좀 있으리라 생각합니다. 마땅한 출처를 달기가 애매하여서 혹여 궁금하신분들은 찾아보시면 도움이 좀 될것 입니다. 필자가 사용한 이유는 if를 통해서 분기가 나눠지지만 결국 해야할 작업은 똑같기 때문에 저런식으로 했습니다.


Slot 두개의 Type과 Index를 서로 바꿔주고 갱신시키도록 했습니다. 이 다음에는 다시 goto문을 이용해 함수가 끝나는 부분으로 이동합니다. 이제 빌드를 해보고 잘 작동하나 확인해봅시다.


<잘되는가 싶더니 또 생기는 문제>


QuickSlot은 참 사람힘들게 만드는 재주가 있는 것 같습니다. 다른 ItemData를 참조하고 있는 Slot끼리 Swap할 경우는 문제없이 잘 되는데 같은 ItemData를 참조하는 Slot끼리 Swap을 하면 하나가 갱신이 안되는 문제가 생깁니다.


코드를 천천히 보면서 생각해 보니 두 QuickSlot이 같은 ItemData를 참조하고 있다면 딱히 바꿀필요가 없다는 사실을 깨닫게 되었습니다. 해당부분만 예외 처리를 해주면 큰 문제없이 편안하게 해결 가능하리라 봅니다.


SlotDrag.cpp

<단 한줄>


아주 귀엽게 딱 한줄만 추가하면 문제 해결입니다. QuickSlot 둘이 같은걸 참조하고있다면? 굳이 바꿀필요 없기때문입니다.


<드디어 끝난 QuickSlot과의 싸움>


생각보다 고려해야할 부분도 많았고 어려움이 좀 있었던 작업이었지만 CharacterMovement를 직접 만들던 때처럼 재미있는 작업이었습니다. 물론 그때에 비하면 훨씬 쉬운 난이도지만 말이지요.


이렇게 QuickSlot을 완성했으니 이제 지긋지긋한 UI와는 한동안 멀어져도 될것 같습니다. 다음부터는 전투를 하기위해 플레이어 캐릭터가 공격할 수 있도록 만들어야겠습니다. 아마도 애니메이션 작업이 주를 이루지 않을까 싶습니다.

Posted by 별수집가
,