Unreal engine 4 게임개발, Sword RPG, 아이템과 인벤토리 - 2

아이템과 인벤토리 - 2

저번에는 'BP_Inventory'라는 액터를 생성한 후 그 안에서 함수를 만들고 있었습니다.
동영상 튜토리얼을 보고 계속 만들어보겠습니다.

https://www.youtube.com/watch?v=gFbmbejZ38M&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=4
https://www.youtube.com/watch?v=_GDsLKioJOQ&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=5



함수 'Add item'을 추가하고 첫번째 사진과 같이 구성합니다.
입력과 출력은 두번째 사진과 같이 구성합니다.
인벤토리에 추가한 아이템의 클래스와 양을 입력받고 성공여부와 나머지 양을 출력합니다.


Add Item의 시작부분입니다. 참조를 쉽게 할 수 있도록 Local Class와 Local Amount를
만들고 입력과 연결해줍니다.
그 후 분해를 통해 'Can be Stacked?'로 분기점을 만들어줍니다.

여기서 'Can be Stacked?'는 말 그대로 아이템이 쌓일 수 있는지 물어보는 것이고
아이템을 설정할 때 체력 물약은 True, 지도와 마법의 반지는 False로 했습니다.


'Can be Stacked'가 False인, 쌓일 수 없는 아이템을 인벤토리에 더하는 블루프린트입니다.
우선 'Search Empty Slot'과 Branch를 놓아 분기를 만듭니다.

1. False일 경우
빈 슬롯을 찾는 데 실패했으므로 Local Amount를 모두 Rest로 넣고 Success?를 False로 합니다.

2. True일 경우
빈 슬롯을 찾았으니 아이템을 넣어야합니다. 'Set Array Elem'을 생성합니다.
이것은 배열과 인덱스가 주어지면 해당 배열 요소에 아이템을 할당합니다.

Found Index를 만들고 Target Array와 Index, Item Class를 할당해줍니다. 이쪽 블루프린트로 들어온 아이템은 쌓이지 않기 때문에 Item Amount를 1로 설정해줍니다.

쌓이지 않는 아이템이지만 한 번에 여러 개를 줍는 경우가 생길 수도 있습니다.
뒤에 분기를 추가해줍니다.

2-1. False일 경우
주울 아이템이 하나였으므로 Success?를 True로, Rest를 0으로 합니다. 아이템 하나를 깔끔하게 주웠습니다.

2-2. True일 경우
주울 아이템이 여러 개이므로 슬롯 하나에 아이템 하나씩, 가능한 모두 줍도록 만듭니다. Add Item을 생성하여 Item Class와 Local Amount에서 1을 뺀 값을 넣어줍니다. 마지막으로 반환 노드에 Success?와 Rest를 연결하면 아이템 여러 개를 하나씩 줍는 블루프린트가 완성됩니다.


획득한 아이템이 'Can be Stacked?'이면, 즉 한 슬롯에 여러 개 쌓을 수 있다면
Search Free Stack을 사용해 분기를 만듭니다.

Search Free Stack은 아이템이 있는 슬롯을 찾아서

1. 획득한 아이템과 같은 아이템이다.
2. 슬롯에 아이템을 하나라도 쌓을 공간이 있다.

위의 2가지 조건을 모두 만족하면 Success?가 True, 나머지 경우에는 False입니다.


Search Free Stack이 False일 경우의 구성입니다. 

Search Empty Slot로 빈 슬롯을 찾아주는 분기를 만듭니다.

1. False라면 아이템을 넣을 수 없다는 의미이므로
'Success?'를 False로, Local Amount를 모두 Rest에 연결합니다.

2. True라면 Local Amount와 Max Stack Size의 크기를 비교하여 분기를 만들어줍니다.
추가로 발견한 빈 슬롯의 Index를 로컬함수 Found Index에 넣어줍니다.

2-1. Local Amount > Max Stack Size라면
획득한 아이템의 양이 한 슬롯에 쌓을 수 있는 양보다 많으므로
하나의 슬롯을 가득 쌓고 나머지를 Add Item에 넣는 식으로 해결합니다.

2-2. Local Amount =< Max Stack Size라면
획득한 아이템의 양만큼 빈 슬롯에 넣어줍니다.


Search Free Stack이 True일 경우의 구성입니다. 

찾은 슬롯에 미리 있던 아이템의 양(Found Index에 있는 Amount)을 구해
획득한 아이템의 양(Local Amount)과 더합니다.
이를 Max Stack Size와 비교하는 분기를 만듭니다.

1. (위의 구성에서) False라면 찾은 슬롯에 아이템을 넣어도 용량을 초과하지 않습니다. Index에는 Found Index를 넣고
Amount에는 Local Amount+Found Index를 분해해 얻은 Amount를 넣어줍니다.

2. (위의 구성에서) True라면 슬롯에 미리 있던 아이템의 양과 획득한 아이템의 양을 합친 값이 한 슬롯의 용량을 초과한다는 의미입니다.

 Local Amount에 [(Local Amount+기존 아이템 Amount) - Max Stack Size]의 값을 넣고
Set Array Elem에 Max Stack Size를 Item Amount로 넣어 아이템이 꽉 찬 슬롯을 하나 만듭니다.
그 후 Add Item을 생성하고 Local Amount를 넣어주면 슬롯이 남아 있는 한 조건에 따라 최대한 아이템을 획득하는 블루프린트가 완성됩니다.

이제 인벤토리가 작동하는지 확인할 준비를 합니다.


AmountOfSlots을 20, Max Stack Size를 99로 설정했습니다.


어흥이 블루프린트에 들어갑니다.

게임을 실행할 때 Actor 인벤토리를 스폰할 수 있게 구성합니다.
SpawnTransform은 우클릭으로 구조체 핀을 분할해주고
SpawnActorBPInventory의 Return Value를 변수로 승격시켜 Inventory Ref를 만들어줍니다.


획득할 아이템을 만듭니다. Overlap 이벤트를 만들어 캐릭터와 부딪히면 스폰한 인벤토리가 유효한지 확인한 후 Add Item에 연결합니다. 남은 아이템이 없으면 아이템 형태를 담당한 액터를 파괴합니다.


잘 작동하는지 확인할 수 있게 만든 블루프린트입니다.


아이템을 획득하고 1, 2번을 누르면 잘 작동하는 걸 확인할 수 있습니다.

다음 포스트에서는 슬롯과 인벤토리의 위젯들을 따라 만들어보겠습니다.

댓글