대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(6) 라이브서비스

2D MMO 라이브 서비스 - (1 - 8) 아이템 (2)

monstro 2025. 9. 15. 14:39
728x90
반응형

- 개요

이전 포스트에 이어서 아이템에 관련한 작업을 수행해보겠습니다.

아이템과 관련한 동작을 수행하는 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 / 아이템의 개수짝의 데이터가

클라이언트에서도 잘 출력되는 것을 확인할 수 있습니다.

728x90
반응형