- 개요
이전 포스트에 이어서 아이템에 관련한 작업을 수행해보겠습니다.
아이템과 관련한 동작을 수행하는 Item 클래스를 생성하고
해당 클래스를 상속하여 Weapon / Armor / Consumable 클래스를 생성해보겠습니다.
또, 간단하게 구성한 Inventory 클래스를 생성하여 플레이어에게 아이템이 전달되는지 실험합니다.
1) 서버 사이드
1 - 1) Item 클래스
1 - 1 -1) Item 클래스

위와 같이 구성된 프로퍼티들을 추가합니다.
- Info : ItemInfo로서 아이템에 필요한 정보들을 가져오는 용도
- ItemDbId : 현재 해당 아이템의 ID
- TemplateId : 해당 아이템의 원본 ID
- Count : 현재 해당 아이템의 개수
- ItemType : 현재 해당 아이템의 아이템 타입
- Stackable : 현재 해당 아이템을 중첩하여 소유할 수 있는지 여부

멤버함수의 구성은 위와 같습니다.
- 생성자 : ItemType을 넘겨주어 타입에 맞는 아이템을 생성
- MakeItem 함수 : DB에서 TemplateId에 맞는 아이템을 가져오고 ItemDbId / Count를 설정하여 반환
1 - 1 - 2) Weapon 클래스

아이템 중에서 무기를 위한 Weapon 클래스는 위와 같이 구성하였습니다.
멤버 변수는 Damage로서 무기가 갖고 있는 공격력을 의미합니다.
멤버 함수는 다음과 같습니다.
- 생성자 : 부모 생성자에 ItemType.Weapon을 넘겨주고 Init 함수를 호출
- Init 함수 : DB로부터 TemplateId에 맞는 무기를 가져오고 Weapon에 맞는 어트리뷰트를 설정하여 반환
1 - 1 - 3) Armor 클래스

아이템 중에서 방어구를 의미하는 Armor 클래스는 위와 같이 구성하였습니다.
멤버 변수는 Defence로서 방어구가 갖고 있는 방어력을 의미합니다.
멤버 함수는 다음과 같습니다.
- 생성자 : 부모 생성자에 ItemType.Armor를 넘겨주고 Init 함수를 호출
- Init 함수 : DB로부터 TemplateId에 맞는 방어구를 가져오고 Armor에 맞는 어트리뷰트를 설정하여 반환
1 - 1 - 4) Consumable 클래스

아이템 중에서 소모품을 의미하는 Armor 클래스는 위와 같이 구성하였습니다.
멤버 변수는 MaxCount로서 소모품의 최대 보유량를 의미합니다.
멤버 함수는 다음과 같습니다.
- 생성자 : 부모 생성자에 ItemType.Consumable을 넘겨주고 Init 함수를 호출
- Init 함수 : DB로부터 TemplateId에 맞는 소모품을 가져오고 Consumable에 맞는 어트리뷰트를 설정하여 반환
1 - 2) Inventory 클래스

플레이어가 갖고 있는 아이템을 저장하는 Inventory 클래스의 구성은 위와 같습니다.
멤버 변수로서 ItemDbId를 Key로, Item을 Value로 저장하는 딕셔너리 _items를 갖고 있습니다.
멤버 함수의 구성은 다음과 같습니다.
- Add 함수 : _items 멤버변수에 아이템 추가
- Get 함수 : 인자로 받은 ItemDbId에 해당하는 아이템 반환
- Find 함수 : 조건에 맞는 Item을 찾아서 반환
1 - 3) Player 클래스

Invnentory 클래스를 멤버 변수로 추가합니다.
1 - 4) ClientSession_PreGame 클래스

HandleEnterGame 함수에 위의 로직을 추가합니다.
DB에서 items를 가져온 후에 순회하면서 플레이어의 인벤토리에 아이템을 추가하고,
추가한 아이템의 ItemInfo를 가져와 S_ItemList 패킷에 추가합니다.
1 - 5) 메인 프로그램 클래스

테스트용 코드를 추가합니다.
DB에 아이템 원본 ID - 아이템 개수의 짝이 지어진 1 - 1 / 100 - 1 / 101 - 1 / 200 - 10의 아이템을 추가합니다.
2) 클라이언트 사이드
2 - 1) ItemData.json

위와 같이 서버에서 명시한 아이템의 원본 ID를 지닌 데이터를 추가합니다.
2 - 2) PacketHandler 클래스

서버에서 보내진 S_ItemList 패킷에 대응하는 S_ItemListHandler 함수를 정의합니다.
로직의 구성은 위와 같은데, 전달받은 패킷의 Items를 순회하면서 아이템 원본 ID와 아이템의 개수를 출력합니다.
- 최종 실행 결과

위와 같이 서버에서 인벤토리에 추가한 아이템의 원본 ID / 아이템의 개수짝의 데이터가
클라이언트에서도 잘 출력되는 것을 확인할 수 있습니다.
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (6) 라이브서비스' 카테고리의 다른 글
| 2D MMO 라이브 서비스 - (1 - 10) 인벤토리 (2) (0) | 2025.09.16 |
|---|---|
| 2D MMO 라이브 서비스 - (1 - 9) 인벤토리 (1) (0) | 2025.09.16 |
| 2D MMO 라이브 서비스 - (1 - 7) 아이템 (1) (0) | 2025.09.15 |
| 2D MMO 라이브 서비스 - (1 - 6) Hp 연동 (2) (0) | 2025.09.09 |
| 2D MMO 라이브 서비스 - (1 - 5) Hp 연동 (1) (0) | 2025.09.08 |