안녕하세요. '언리얼로 만들어보는 RPG'의 필자입니다. 이번에는 인벤토리의 아이템을 사용하고 가능하면 Drag&Drop까지 해볼 생각입니다. 물론 현재 캐릭터의 상태에 대한 표시를 해줄 UI 예를 들어 HPBar 같은게 존재하지 않음으로 간단하게 디버그메세지로 확인할것입니다.
이번글을 본격적으로 시작하기전에 해야할 밑작업이 있습니다. 우선 아이템 정보를 가진 구조체의 정의와 이용방식을 좀 바꿔야 합니다. 인벤토리 구현을 처음 시작할때 상속을 통한 가상함수 오버라이딩을 이용하려고 했었지만 언리얼에서는 구조체 포인터는 UPROPERTY 시스템에서 관리해주지 않기 때문입니다.
물론 구조체의 상속을 통한 가상함수 오버라이딩을 사용할 수 없는것은 아니지만 필자가 원하는 방식은 아니기 때문에 설명은 생략하도록 하겠습니다. 혹시 궁금하신분이 있으시다면 나중에 기회를 봐서 작성해 보도록 하겠습니다.
PlayerBase.h
<강한 거부의사를 밝히는 언리얼>
이러한 이유로 인해서 필자는 많은 고민을 했었는데 초기에 생각했었던 에디터상에서 정보를 조절해줄 수 있는걸 포기하고 싶지 않았습니다. UObject를 상속받아서 만들어보기도 하고 SceneComponent를 상속받아서 32개의 컴포넌트를 달아주는 미친짓도 해보았습니다. 결국 선택한 방법은 구조체 안에 또 구조체를 넣어버리는 몰상식한 일명 '무한 구조체 패턴'을 선택한 것입니다.
InGameData.h
<포션의 정보를 담을 구조체>
InGameData.h
기존의 ItemData에서 가상함수를 없애버렸습니다. 그리고 포션정보를 담아줄 FPotionData 구조체를 변수로 하나 들고있게 해주었습니다. 필자 또한 알고있습니다 이게 얼마나 끔찍한 행동인지 하지만 어쩔 수 없는 선택이라고 위안을 삼고 있습니다.
이제부터는 아이템이 사용될경우 어떻게 해서 플레이어의 상태를 변경해줄 것인지에 대해서 코드를 작성할 시간입니다.
InGameData.cpp
저번과 코드가 좀 달라진 부분은 스위치문이 생겼다는것 정도입니다. 필자가 선택한 절충안은 보기에 좀 별로이긴 하지만 그래도 나름 만족하고 있습니다.
InGameData.cpp
아이템을 사용할때 Player포인터를 받아와서 이렇게 Ability에 접근하여 Ability에서 처리하도록 만들었습니다. 이게 객체지향적인 프로그래밍이라할 수 있는지는 모르겠지만 필자 생각에는 그냥 그렇게 하는게 좋을것 같았습니다.
InGameData.h
CharacterAbility에도 꽤나 많은 변화가 생겼습니다. 저번에 대충 만들었던거에 비하면 필요한 부분들을 다 채워넣었다고 보시면됩니다. 그리고 이번에 가장 중요한 ChangeHP-Resource 함수를 선언해줬습니다.
InGameData.cpp
이로써 기본적인 준비가 드디어 끝났습니다. 아니 뭐 별거 하지도 않은거 같은데 시간은 왜이리 빨리 가는지알 수가 없는 노릇입니다. 이제 할건 Slot UI에서 마우스 입력을 처리해서 아이템을 사용하기만 하면 됩니다.
회복하기전의 체력은 빨간색으로 회복하고난 다음의 체력은 초록색으로 표시하기로 하고 작업을 하기전에 빌드를 한번 하여 에디터에서는 어떻게 되었는지 한번 확인해봅시다.
BpPlayer(블루프린트)
구조체 안에 구조체가 있는 매우 기괴하지만 원하는 그림이 완성되었습니다.
Slot.h
이미지에 있는 NativeOnMouseButtonDown함수는 실제로 에디터상에서도 오버라이딩이 가능한 함수중 하나입니다. 필자도 자세한건 사실 잘 모르는데 오버라이딩 하려고 원본 함수를 찾아가보시면 해당 함수 안에서 에디터에서 부르는 OnMouseButtonDown함수를 호출하는걸 보실 수 있습니다.
언리얼에서는 이런식으로 에디터에서도 C++상에서도 오버라이딩 하여서 원하는 방식으로 구현할 수 있는 기회를 제공해주는것 같습니다. 물론 필자에게는 매우 좋은 이야기입니다.
Slot.cpp
실질적인 행동을 해주는 코드입니다. 필자의 경우 버튼으로도 해보았었지만 버튼보다는 이렇게 마우스이벤트를 오버라이딩 해서 사용하는게 더 좋은것 같습니다. 이로써 포션뿐이긴 하지만 아이템을 사용하기 위한 작업은 끝났습니다. 이제 빌드를 하시고 직접 테스트 하기만 하면 끝입니다!
<정상적으로 작동하고 있다>
움짤의 화질이 너무 좋지 않은것 같아서 따로 사진을 찍어서 보여드립니다. Drag&Drop까지 하고싶었는데 변경된 부분이 생각보다 많아서 시간이 꽤나 걸렸습니다. 필자는 이만 여기서 물러가고 다음 포스팅때 Drag&Drop을 하도록 하겠습니다. 그 다음에는 체력과 마력, 경험치 등을 보여주는 UI를 만들어볼 예정입니다.
'프로그래밍 > 언리얼' 카테고리의 다른 글
언리얼로 만들어보는 RPG - 진행 바 구현 (0) | 2019.02.13 |
---|---|
언리얼로 만들어보는 RPG - 인벤토리 구현(5) (0) | 2019.02.11 |
언리얼로 만들어보는 RPG - 인벤토리 구현(3) (0) | 2019.02.04 |
언리얼로 만들어보는 RPG - 인벤토리 구현(2) (0) | 2019.02.01 |
언리얼로 만들어보는 RPG - 인벤토리 구현(1) (1) | 2019.01.31 |