- 개요
몬스터를 처치한 후에 보상을 받는 작업을 마저 구현해보겠습니다.
이번에는 코드를 완성하여 적을 처치하면 확률적으로 인벤토리에 아이템을 추가해보겠습니다.
코드 변경 : RewardData 클래스 - probability 변수 이름 수정 / ItemDb 클래스 - OwnerDbId 변수 이름 수정
1) proto 파일


서버에서 몬스터를 처치하면 보상을 주는 S_AddItem 패킷을 추가합니다.
해당 패킷에서는 여러개의 보상을 지급할 수 있으므로 repeated 멤버변수를 갖고 있도록 설정합니다.
2) 서버 사이드
2 - 1) Inventory 클래스

GetEmptySlot 함수를 추가합니다.
해당 함수를 사용하여 인벤토리에서 비어있는 슬롯을 반환할 수 있습니다.
반환값을 nullable로 설정하여 int 반환값을 null로 반환할 수 있도록 설정합니다.
2 - 2) GameObject 클래스

투사체나 펫 등은 GameObject이지만 다른 GameObject에 의해 종속됩니다.
따라서 GetOwner 함수를 호출하여 투사체나 펫 등의 주인을 설정할 수 있습니다.
2 - 3) Arrow 클래스

Arrow 클래스에서는 기존의 Owner 프로퍼티를 사용하여 주인을 설정합니다.
2 - 4) DbTransaction 클래스

RewardPlayer 함수를 위와 같이 추가합니다.
해당 함수를 호출하여 플레이어의 인벤토리에 처치 보상으로 지급된 아이템을 추가합니다.
로직은 다음과 같습니다.
- 비어있는 슬롯을 가져옴
- 처치 보상으로 지급된 아이템의 ItemDb 생성
- 람다 함수를 통해 GameRoom에서 Job을 생성
- DB로 Job을 전달하여 처리(Add)하고, S_AddItem 패킷을 클라이언트로 전송
*** 남아있는 문제 ***
RewardPlayer 함수의 문제는 다음과 같습니다.
절차는 다음과 같이 진행됩니다.
- 1) DB에 저장(Add)을 요청
- 2) DB에서 성공적으로 저장되(Add)었다면
- 3) 메모리에 적용
이때 두개의 아이템이 동시에 지급되는 경우 DB에서는 문제없이 저장되지만,
메모리에서는 각기 다른 아이템이 동일한 슬롯에 저장되는 문제가 발생할 수 있습니다.
즉, 타이밍 문제가 발생할 수 있으므로 추후 수정하도록 하겠습니다.
2 - 5) Monster 클래스

OnDead 함수를 위와 같이 오버라이드합니다.
몬스터를 처치한 대상의 Owner를 가져와 Player라면, 처치보상을 지급합니다.
3) 클라이언트 사이드
3 - 1) PackerHandler 클래스

서버로부터 받은 S_AddItem 패킷에 대응하는 S_AddItemHandler 함수를 추가합니다.
패킷으로부터 보상으로 받은 아이템을 가져와 InventoryManager에 추가합니다.
3 - 2) MyPlayerController 클래스

GetUIKeyInput 함수를 추가합니다.
해당 함수를 통해 I 키를 눌러 인벤토리 UI를 열고 닫을 수 있습니다.

UpdateController 함수에서 GetUIKeyInput 함수를 호출합니다.
- 최종 실행 결과
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (6) 라이브서비스' 카테고리의 다른 글
| 2D MMO 라이브 서비스 - (1 - 14) 아이템 착용 (2) (0) | 2025.09.23 |
|---|---|
| 2D MMO 라이브 서비스 - (1 - 13) 아이템 착용 (1) (0) | 2025.09.23 |
| 2D MMO 라이브 서비스 - (1 - 11) 처치 보상 (1) (0) | 2025.09.22 |
| 2D MMO 라이브 서비스 - (1 - 10) 인벤토리 (2) (0) | 2025.09.16 |
| 2D MMO 라이브 서비스 - (1 - 9) 인벤토리 (1) (0) | 2025.09.16 |