안녕하세요 게으른 몸을 이끌고 다시 돌아온 '언리얼로 만들어보는 RPG'의 필자입니다. 마지막 글에서는 전투를 작업하겠다고 했었지만 마무리 짖지 못한 UI가 필자의 발목을 잡고 말았습니다. 결국 장비창을 만들고 장비를 착용하고 해체하는등의 작업을 해볼 예정입니다.


이번글에서 작업할 내용은 대충 이러합니다.

1. 런타임에서 스폰시킬 Item 클래스 만들기

2. 스폰시킨 Item을 붙일 (*)소켓 준비하기

3. 장비창UI 만들기


그럼 바로 작업을 시작하기전에 Item을 어떻게 구성할지에 대해서 대략적인 밑그림을 그리는게 좋을것 같습니다. 필자가 확인한바에 의하면 Item으로 사용되는 모델이 Skeletal인 경우도 있고 Static인 경우도 있습니다. 그러니 이 두가지의 경우를 모두 고려해서 만드는게 좋을것 같군요.


또 런타임에서 아이템을 줍기 위해서 Item은 주울 수 있는 반경을 가지고 있어야 할 거 같습니다. 아마 Sphere충돌체를 통해서 해결할 수 있을 것 같네요. 이외에는 칼같은 근접무기에 붙여줄 충돌체도 필요하겠네요. 이정도면 뭐 어느정도 준비가 된거 같습니다.


ItemBase.h

Actor클래스를 상속받아서 ItemBase클래스를 만들어줍니다. Item을 주울수 있는 범위를 위한 SpehreComponent와 무기에서 사용될 CapsuleComponent를 선언해줍니다. ArrowComponent는 CharacterBase를 만들때도 사용했었던 Component인데 에디터상에서만 정면이 어디인지를 알려주는 용도로 사용됩니다.


ItemBase.cpp

SceneComponent를 Root에 생성해서 할당해주고 충돌체 두개는 공통적으로 사용될 것이기 때문에 여기서 만들어줍니다. 이제 이 ItemBase를 기반으로 StaticMesh를 이용하는 Item과 SkeletalMesh를 이용하는 Item클래스를 따로 만들어 줄 것입니다.


SkeletalItem.h

필요한 충돌체 Component는 ItemBase에서 만들어두었기 때문에 여기에서는 필요한 MeshComponent만 하나 선언해 줍니다.


SkeletalItem.cpp

MeshComponent를 생성하고 Root에 붙여줍니다. 그리고 아까 ItemBase에서 만들어두었던 CapsuleComponent는 Mesh밑으로 붙여주면 준비는 끝입니다.


InGameData.h(FItemData)

필자가 중요한 부분을 깜빡할 뻔 했습니다. 이제 데이터상으로만 있던 정보를 기반으로 Item을 스폰시켜야 하기때문에 어떤 Item을 스폰시켜줄지 정해줘야 합니다. 그 부분은 빨간색박스 안에있는 변수를 에디터에서 설정해주어서 사용할 것입니다.


필자의 경우 무기모델이 SkeletalMesh여서 StaticItem은 작업한걸 보여드리지 않았습니다. 하지만 눈치빠른 분들이라면 StaticItem또한 별로 다를게 없다는걸 아시리라 믿습니다. 첫번째 준비가 끝났으니까 이제는 소켓을 만들러가면 됩니다.


UE4_Mannequin(Skeleton 에디터)

필자는 언리얼에서 기본으로 제공해주는 마네킹을 이용하고있습니다. 오른손(hand_r)에 'Weapon'이라는 소켓을추가했습니다. 혹시 궁금하신분들이 있을것 같아서 소켓의 위치값은 X : -10 Y : 5 입니다.


두번째 준비까지 끝났습니다. 이건 너무 쉬운부분이라서 날로먹는 기분이 드네요. 이제 장비 UI를 만들어야 하는데 필자가 작업을 하다보니 부족한부분이 몇개 있었습니다. 그부분들을 보완하고 가도록 하겠습니다.


InGameData.h

<SlotType에 Gear를 추가해주었다>

<ItemType에 Weapon을 추가하고 순서를 변경했다>


필자의 경우 장비를 착용하면 인벤토리에서 빠지고 장비창으로 들어가는 방식을 하기로 했습니다. 지금 생각해보면 그럴필요 있나 싶긴 하지만 뭔가 그러고 싶었거든요. 아무튼 다시 본론으로 돌아가서 Skill에 대한 Type이 따로 지정되어있는데 장비에 대한 Type이 없으니까 작업할때 애로사항이 좀 생겼습니다. 어찌보면 당연한 거였는데 필자가 너무 대충 설계했던거 같습니다.


ItemType의 경우에는 순서를 좀 바꾸었는데 Type을 이용해서 장비관련 배열의 크기를 정하고 Index로 활용해서 접근하려고 했습니다. 글로만 적으니 뭔가 확 와닿지 않는게 설명이 좀 부실한거 같습니다. 자세한건 다음 작업을따라가면서 확인하도록 하고 이제 장비UI를 만들러 가보겠습니다.


PlayerBase.h

스폰해서 장비한 Item을 들고있을 배열과 UI에서 이용할 Data배열을 선언해줍니다.


PlayerBase.cpp

아까 ItemType의 순서를 바꿔서 배열크기와 접근에 이용할거라 했었습니다. 현재 착용할 수 있는 장비는 무기 하나뿐이기 때문에 저런방식으로 크기를 만들어주면 딱 알맞게 배열이 생성됩니다.


GearSet.h

CustomUI를 상속받아서 저번에 만들었던 Inventory와 마찬가지의 구성을 취합니다. 기본으로 쓰일 이미지와 Slot들을 담아둘 배열을 준비해 주도록 하지요.


GearSet.cpp

이후의 작업은 저번 인벤토리떄와 비슷합니다. Player포인터를 채워주고 Type을 지정해주고 초기화시킨다음 배열에 집어넣어주는 작업을 하면 끝입니다.


이제 위젯블루프린트를 만들어서 UI작업만 해주면 됩니다! 필자의 끔찍한 디자인적 감각을 보완하기위해서 참고한 영상이 있는데 이걸 보시는 분들에게도 도움이 되었으면 합니다.



BpGearSet(UMG 에디터)

영상을 보시면서 천천히 따라하시다 보면 이렇게 그럴싸해보이는 UI가 나오게 됩니다. 사실 의미가 있나 싶기는 하지만 보기좋은떡이 먹기도 좋다고 하지않습니까? 그런의미로 이번글은 여기서 마무리 짖도록 하고 다음에는 장비의 착용과 해제 그리고 Item을 주울 수 있도록 작업해 보도록 하겠습니다.


솔직하게 Item을 줍는건 살짝 희망사항입니다. 그럼 읽어주셔서 감사합니다.

Posted by 별수집가
,