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

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

monstro 2025. 9. 15. 10:56
728x90
반응형

- 개요

프로젝트에 아이템을 추가해보도록 하겠습니다.

아이템은 플레이어에 의해 소유되며 플레이어와 아이템의 관계는 1 : 多의 관계로 구성됩니다.

아이템의 종류는 다음과 같습니다.

  • 무기
  • 방어구
  • 소모품

 

1) DataModel 클래스

 

Player 테이블에 Items 멤버변수를 추가합니다.

해당 멤버변수는 플레이어가 소유하고 있는 아이템을 저장하는 용도로 사용합니다.

 

 

Item 테이블을 위와 같이 구성하여 추가하였습니다.

  • ItemDbId : 현재 해당 아이템의 ID
  • TemplateId : 해당 아이템의 원본 ID
  • Count : 현재 해당 아이템의 개수
  • Slot : 현재 해당 아이템이 위치한 인벤토리의 슬롯
  • OwnerId : 현재 해당 아이템을 소유하고 있는 플레이어의 ID / 소유하지 않는 경우를 위해 nullable로 설정
  • Owner : 현재 해당 아이템을 소유하고 있는 플레이어

 

2) AppDbContext 클래스

 

ItemDb를 저장하는 DbSet을 멤버변수로 추가합니다.

 

3) proto 파일

 

서버에서 클라이언트로 전송하여 갖고 있는 아이템을 동기화할 S_Item_List 패킷을 추가합니다.

 

 

아이템마다의 타입을 지정한 ItemType을 추가합니다.

ItemType은 각각 무기 / 방어구 / 소모품으로 구성되어 있으며, 다시 다음과 같이 세분화됩니다.

  • 무기 - 검 / 활
  • 방어구 - 헬멧 / 갑옷 / 신발
  • 소모품 - 포션

 

 

S_ItemList 패킷은 위와 같이 구성되어 있습니다.

여러개의 ItemInfo를 저장하는 items를 멤버로 갖고 있습니다.

 

 

ItemInfo는 위와 같이 구성하였습니다.

  • itemDbId : 현재 해당 아이템의 ID
  • templateId : 해당 아이템의 원본 ID
  • count : 현재 해당 아이템의 개수
  • slot : 현재 해당 아이템이 위치한 인벤토리의 슬롯

 

4) Data.Contents 클래스

 

직렬화가 가능한 ItemData 클래스를 상속받은 WeaponData / ArmorData / ConsumableData를 추가합니다.

  • ItemData : 아이템의 ID / 아이템의 이름 / 아이템의 타입
  • WeaponData : 무기의 타입 / 무기의 데미지
  • ArmorData : 방어구의 타입 / 방어구의 방어력
  • ConsumableData : 소모품의 타입 / 소모품의 개수

 

 

아이템의 데이터를 로딩하는 ItemLoader 클래스를 위와 같이 정의하였습니다.

각 아이템의 타입별 딕셔너리를 채우고, 채워진 각각의 딕셔너리를 하나의 딕셔너리에 넣어 반환합니다.

 

5) DataManager 클래스

 

ItemData를 저장하는 ItemDict 멤버변수를 추가합니다.

 

 

LoadData 함수에 ItemLoader를 통해 Item의 데이터를 불러와 ItemData에 저장하는 로직을 추가합니다.

 

6) ClientSession_PreGame 클래스

 

HandleEnterGame 함수에 게임에 입장하는 플레이어의 아이템을 DB로부터 가져와

서버-클라이언트에 모두 동기화하는 로직을 추가합니다.

728x90
반응형