Unreal engine 4 게임개발, Sword RPG, 아이템과 인벤토리 - 1
아이템과 인벤토리 - 1
안녕하세요..이제 아이템과 인벤토리를 만들어 볼 텐데요...
어떻게 만드는지 잘 모르기 때문에 일단 아래 링크로 볼 수 있는 동영상을
무작정 따라해보려 합니다.
이번 포스트에서는 초기 설정을 하고 인벤토리 기능을 구현하는 블루프린트 함수를 따라 만들어보겠습니다.
https://www.youtube.com/watch?v=OwKF1WcWJ10&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=3
https://www.youtube.com/watch?v=gFbmbejZ38M&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=4
Inventory 폴더를 만들고 Blueprints, DragAndDrop, Textures, Widgets 폴더를 만듭니다.
각각의 이름에 맞는 기능을 담아놓기 위한 폴더입니다.
Textures 폴더에 ItemIcons 폴더를 만듭니다.
그리고 해당 튜토리얼 영상 아래 정보를 통해 얻은 텍스처 중
Inventory Button을 사진과 같이 놓습니다. 인벤토리의 버튼이 될 텍스처입니다.
ItemIcons에는 Icon_Map, Icon_Potion, Icon_Ring을 놓습니다.
아이템들의 아이콘이 될 텍스처입니다.
Inventory Button 텍스처를 클릭해 들어가 설정을 바꿉니다.
Compression Settings(압축 설정)을 UserInterface2d(RGBA)로,
LOD의 Texture Group을 UI로 설정했습니다.
인벤토리에 쓰이는 텍스처인 걸 고려한 세세한 설정인 듯 합니다.
ItemIcons에 있는 텍스처들을 한꺼번에 선택 후 프로퍼티 매트릭스로 편집해줍니다.
마찬가지로
Compression Settings(압축 설정)을 UserInterface2d(RGBA)로,
LOD의 Texture Group을 UI로 설정합니다.
Inventory - Blueprints 폴더에 Structures를 만들어줍니다.
Structures에 들어가 우클릭으로 '구조체'를 만들어줍시다.
이름은 S_ItemInfo로 합니다.
클릭해서 들어가 아이템의 정보가 될 변수들을 위처럼 구성해줍니다.
인벤토리를 만드려면
아이템의 이름, 아이콘, 아이템 설명, 사용 가능 여부 등 다양한 정보를 사용해야합니다.
때문에 다양한 유형의 변수로 정보를 만들 수 있는 구조체를 사용한겁니다.
Category의 변수 유형은 잠시 뒤 직접 만들어서 넣습니다.
Inventory - Blueprints 폴더에 Enums를 추가해줍니다.
폴더에 들어가 우클릭으로 '열거형(Enum)'을 만들었습니다. 이름은 E_ItemCategories입니다.
위와 같이 'Consumable, EquipMent, Quest Items, Readables'를 만들었습니다.
구조체 S_ItemInfo로 돌아가 Category의 변수 유형을 방금 만든 E_ItemCategories로 해줍니다.
아래 'UseText'의 기본값을 Use로, 'CanBeUsed?'의 기본값을 True로 해준 후 닫습니다.
Inventory - Blueprints 폴더에 ItemClasses를 새로 만듭니다.
우클릭 후 블루프린트 클래스를 누르고 Actor를 만듭니다. 이름은 'BP_MasterItem'입니다.
변수를 추가하여 이름을 ItemInfo로, 변수 유형을 S_ItemInfo로 해줍니다.
BP_MasterItem을 사용할 때를 위해 커스텀 이벤트인 EventOnUsed를 만들어놓고 닫습니다.
이제 BP_MasterItem을 우클릭하여 자손 블루프린트 클래스를 생성합니다.
그러면 해당 블루프린트를 기반으로 블루프린트 클래스를 만들 수 있는데
이것들을 여러 개 만들고 각각의 설정을 다르게 하면 다양한 아이템이 생기는 것입니다.
총 3개의 자손을 만듭니다.
첫 번째 자손은 HealthPotion입니다. 설정은 위와 같이 디테일의 ItemInfo에서 합니다.
Map과 Ring도 만들어줍니다.
구조체 S_InventorySlot을 만들고 슬롯이 필요로 하는 정보를 변수로 만들어 추가합니다.
ItemClass를 만들고 유형은 BP Master Item - Class로,
Amount를 만들고 유형은 Integer로 해줍니다.
Inventory - Blueprints에 우클릭으로 블루프린트 Actor를 만듭시다.
이름은 BP_Inventory입니다. 인벤토리의 핵심 기능을 담당할 블루프린트입니다.
들어가서 변수를 추가해줍니다.
이름 AmountOfSlots, 변수 유형 Integer, 인스턴스 편집가능, 스폰 시 노출
이름 MaxStackSize, 변수 유형 Integer
이름 어흥CharRef, 변수 유형 어흥, 인스턴스 편집가능, 스폰 시 노출
위에선 빠뜨렸는데 변수에 Slot도 추가해줍니다.
변수 유형은 방금 만들었던 구조체 'S Inventory Slot' 입니다.
그 다음 이벤트 그래프에 위와 같이 만들고 본격적으로 함수를 만듭니다.
빈 슬롯인지 확인하는 함수입니다. Slot을 끌어다놓고 Array의 Get(참조)을 생성한 후
슬롯을 구분지어 줄 Index를 연결해줍니다.
슬롯을 분해하여 확인한 ItemClass가 유효하지 않으면
출력의 Boolean 'Empty?'가 True가 되어 슬롯이 비었다는 걸 알려줄겁니다.
반환노드에 퓨어를 체크합니다.
해당 슬롯(index로 구분)의 아이템 정보를 가져오는 함수입니다. 위와 마찬가지로 ItemClass가 유효하지 않을 때에는 'Empty Slot?'을 True로 하고, 다른 어떤 정보도 가져오지 않습니다.
만약 유효하다면 분해하여 얻은 Amount와 ItemClass의 클래스 디폴트를 반환합시다.
반환노드 2개 모두 퓨어를 체크합니다.
빈 슬롯을 찾는 함수입니다.
'ForEachLoopWithBreak'는 LoopBody에 연결된 부분을 반복적으로 실행하다가
LoopBody를 통해 Break이 활성화되면 멈추는 기능을 합니다.
Item Class가 유효하다면 LoopBody가 계속 실행됩니다.
Item Class가 유효하지 않다면 임의로 만든 로컬 변수
Local Bool을 True로, Local Index에는 해당 Index를 넣어줍니다.
로컬 변수는 각 원래 함수 내에서만 쓰이며 여기에서는 성공 여부(Success?)와 해당 인덱스(Index)를 반환할 때 정보를 알리기 위해 쓰였습니다.
슬롯에 아이템을 쌓을 수 있는지 확인하는 함수입니다.
아이템의 'Can Be Stacked?'가 True일 때(한 슬롯에 여러 개 쌓을 수 있는 아이템일 때)
더 쌓을 공간이 있는지 없는지 확인합니다.
만약 슬롯이 유효하다면
1. 입력받은 Item Class와 해당 슬롯 Item Class가 일치하는지 확인
2. 해당 슬롯의 Amount < Max Stack Size
의 조건을 달고
만약 이 두 조건을 충족하면 로컬 변수를 통해 성공 여부와 Index를 알리며 출력합니다.
이번 포스트는 여기까지 하겠습니다.
다음 포스트에서는 인벤토리 기능을 구현하는 블루프린트를 계속 따라 만들겠습니다.
무작정 따라해보려 합니다.
이번 포스트에서는 초기 설정을 하고 인벤토리 기능을 구현하는 블루프린트 함수를 따라 만들어보겠습니다.
https://www.youtube.com/watch?v=OwKF1WcWJ10&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=3
https://www.youtube.com/watch?v=gFbmbejZ38M&list=PLmKKTERcjTPKEPl0nk48Tpmj-iWmzqo_Q&index=4
Inventory 폴더를 만들고 Blueprints, DragAndDrop, Textures, Widgets 폴더를 만듭니다.
각각의 이름에 맞는 기능을 담아놓기 위한 폴더입니다.
Textures 폴더에 ItemIcons 폴더를 만듭니다.
그리고 해당 튜토리얼 영상 아래 정보를 통해 얻은 텍스처 중
Inventory Button을 사진과 같이 놓습니다. 인벤토리의 버튼이 될 텍스처입니다.
ItemIcons에는 Icon_Map, Icon_Potion, Icon_Ring을 놓습니다.
아이템들의 아이콘이 될 텍스처입니다.
Inventory Button 텍스처를 클릭해 들어가 설정을 바꿉니다.
Compression Settings(압축 설정)을 UserInterface2d(RGBA)로,
LOD의 Texture Group을 UI로 설정했습니다.
인벤토리에 쓰이는 텍스처인 걸 고려한 세세한 설정인 듯 합니다.
ItemIcons에 있는 텍스처들을 한꺼번에 선택 후 프로퍼티 매트릭스로 편집해줍니다.
마찬가지로
Compression Settings(압축 설정)을 UserInterface2d(RGBA)로,
LOD의 Texture Group을 UI로 설정합니다.
Inventory - Blueprints 폴더에 Structures를 만들어줍니다.
Structures에 들어가 우클릭으로 '구조체'를 만들어줍시다.
이름은 S_ItemInfo로 합니다.
클릭해서 들어가 아이템의 정보가 될 변수들을 위처럼 구성해줍니다.
인벤토리를 만드려면
아이템의 이름, 아이콘, 아이템 설명, 사용 가능 여부 등 다양한 정보를 사용해야합니다.
때문에 다양한 유형의 변수로 정보를 만들 수 있는 구조체를 사용한겁니다.
Category의 변수 유형은 잠시 뒤 직접 만들어서 넣습니다.
Inventory - Blueprints 폴더에 Enums를 추가해줍니다.
폴더에 들어가 우클릭으로 '열거형(Enum)'을 만들었습니다. 이름은 E_ItemCategories입니다.
위와 같이 'Consumable, EquipMent, Quest Items, Readables'를 만들었습니다.
Enum(열거형)은 언리얼에서는 아래와 같이 쓰입니다.
Enum 생성하기
Enum 은 각 항목마다 구체적인 이름을 줄 수 있는 옵션 목록입니다. 특정한 옵션에 그냥 숫자 이상으로 좀 더 자세한 설명 라벨이 필요할 때 좋습니다.
이 열거형은 아이템의 카테고리를 만들기 위해 생성한 열거형입니다.구조체 S_ItemInfo로 돌아가 Category의 변수 유형을 방금 만든 E_ItemCategories로 해줍니다.
아래 'UseText'의 기본값을 Use로, 'CanBeUsed?'의 기본값을 True로 해준 후 닫습니다.
Inventory - Blueprints 폴더에 ItemClasses를 새로 만듭니다.
우클릭 후 블루프린트 클래스를 누르고 Actor를 만듭니다. 이름은 'BP_MasterItem'입니다.
변수를 추가하여 이름을 ItemInfo로, 변수 유형을 S_ItemInfo로 해줍니다.
BP_MasterItem을 사용할 때를 위해 커스텀 이벤트인 EventOnUsed를 만들어놓고 닫습니다.
이제 BP_MasterItem을 우클릭하여 자손 블루프린트 클래스를 생성합니다.
그러면 해당 블루프린트를 기반으로 블루프린트 클래스를 만들 수 있는데
이것들을 여러 개 만들고 각각의 설정을 다르게 하면 다양한 아이템이 생기는 것입니다.
총 3개의 자손을 만듭니다.
첫 번째 자손은 HealthPotion입니다. 설정은 위와 같이 디테일의 ItemInfo에서 합니다.
Map과 Ring도 만들어줍니다.
구조체 S_InventorySlot을 만들고 슬롯이 필요로 하는 정보를 변수로 만들어 추가합니다.
ItemClass를 만들고 유형은 BP Master Item - Class로,
Amount를 만들고 유형은 Integer로 해줍니다.
Inventory - Blueprints에 우클릭으로 블루프린트 Actor를 만듭시다.
이름은 BP_Inventory입니다. 인벤토리의 핵심 기능을 담당할 블루프린트입니다.
들어가서 변수를 추가해줍니다.
이름 AmountOfSlots, 변수 유형 Integer, 인스턴스 편집가능, 스폰 시 노출
이름 MaxStackSize, 변수 유형 Integer
이름 어흥CharRef, 변수 유형 어흥, 인스턴스 편집가능, 스폰 시 노출
위에선 빠뜨렸는데 변수에 Slot도 추가해줍니다.
변수 유형은 방금 만들었던 구조체 'S Inventory Slot' 입니다.
그 다음 이벤트 그래프에 위와 같이 만들고 본격적으로 함수를 만듭니다.
빈 슬롯인지 확인하는 함수입니다. Slot을 끌어다놓고 Array의 Get(참조)을 생성한 후
슬롯을 구분지어 줄 Index를 연결해줍니다.
슬롯을 분해하여 확인한 ItemClass가 유효하지 않으면
출력의 Boolean 'Empty?'가 True가 되어 슬롯이 비었다는 걸 알려줄겁니다.
반환노드에 퓨어를 체크합니다.
해당 슬롯(index로 구분)의 아이템 정보를 가져오는 함수입니다. 위와 마찬가지로 ItemClass가 유효하지 않을 때에는 'Empty Slot?'을 True로 하고, 다른 어떤 정보도 가져오지 않습니다.
만약 유효하다면 분해하여 얻은 Amount와 ItemClass의 클래스 디폴트를 반환합시다.
반환노드 2개 모두 퓨어를 체크합니다.
빈 슬롯을 찾는 함수입니다.
'ForEachLoopWithBreak'는 LoopBody에 연결된 부분을 반복적으로 실행하다가
LoopBody를 통해 Break이 활성화되면 멈추는 기능을 합니다.
Item Class가 유효하다면 LoopBody가 계속 실행됩니다.
Item Class가 유효하지 않다면 임의로 만든 로컬 변수
Local Bool을 True로, Local Index에는 해당 Index를 넣어줍니다.
로컬 변수는 각 원래 함수 내에서만 쓰이며 여기에서는 성공 여부(Success?)와 해당 인덱스(Index)를 반환할 때 정보를 알리기 위해 쓰였습니다.
슬롯에 아이템을 쌓을 수 있는지 확인하는 함수입니다.
아이템의 'Can Be Stacked?'가 True일 때(한 슬롯에 여러 개 쌓을 수 있는 아이템일 때)
더 쌓을 공간이 있는지 없는지 확인합니다.
만약 슬롯이 유효하다면
1. 입력받은 Item Class와 해당 슬롯 Item Class가 일치하는지 확인
2. 해당 슬롯의 Amount < Max Stack Size
의 조건을 달고
만약 이 두 조건을 충족하면 로컬 변수를 통해 성공 여부와 Index를 알리며 출력합니다.
이번 포스트는 여기까지 하겠습니다.
다음 포스트에서는 인벤토리 기능을 구현하는 블루프린트를 계속 따라 만들겠습니다.
댓글
댓글 쓰기