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

2D MMO 라이브 서비스 - (1 - 15) 아이템 착용 (3)

monstro 2025. 9. 23. 22:04
728x90
반응형

- 개요

아이템 착용을 마무리하면서 다음의 작업을 처리하겠습니다.

  • 1) 새로운 장비 아이템을 장착하면 같은 타입의 기존의 장착 아이템 해제
  • 2) 장비 아이템을 장착하면 능력치에 영향을 줌
  • 3) 장비를 장착하는 주체를 GameRoom이 아닌 Player로 변경
  • 4) 화살이 매 프레임마다 피격판정을 수행하지 않고, 대신 Job의 개념을 수행하도록 수정
  • 5) 장비를 장착하여 얻는 능력치를 패킷으로 전송하지 않고, 서버 - 클라이언트가 동일한 로직 사용

 

1) 서버 사이드

1 - 1) GameObject 클래스 : 능력치 변경

 

최종 능력치 수치로 결정될 정수형 프로퍼티 2개를 추가합니다.

각각 최종 공격력 / 최종 방어력을 의미합니다.

위와 같이 구현하여 능력치를 직접적으로 수정하지 않고 원하는 결과를 얻을 수 있습니다.

 

 

OnDamaged 함수에서 추가한 최종 방어력 프로퍼티를 사용하도록 수정합니다.

 

1 - 3) Monster 클래스

 

UpdateSkill 함수에서 GameObject에 추가한 최종 공격력 프로퍼티를 사용하여 피해를 주도록 수정합니다. 

 

1 - 2) Inventory 클래스

 

기존의 멤버변수인 _items를 Items 프로퍼티로 변경하여 외부에서도 접근할 수 있도록 수정합니다.

내부 코드에서 변경으로 발생하는 오류를 수정합니다.

 

1 - 3) Player 클래스 : 기존의 장착 아이템 해제 + 장비 장착 주체 변경

 

플레이어는 아이템을 장착하므로 무기로부터 얻은 공격력과 방어구로부터 얻은 방어력 프로퍼티를 추가합니다.

또, 최종 공격력과 최종 방어력의 프로퍼티를 장비와 연관된 능력치 프로퍼티로 설정하도록 로직을 추가합니다.

 

 

RefreshAdditionalStat 함수를 추가합니다.

인벤토리를 순회하면서 장착한 아이템의 타입에 따라서 공격력과 방어력을 증가시킵니다.

 

 

HandleEquipItem 함수를 추가하여 GameRoom이 아닌, Player가 아이템의 장착을 주도합니다.

로직은 다음과 같습니다.

  • 클라이언트로부터 받은 C_EquipItem 패킷으로부터 장착할 인벤토리의 아이템을 가져옴
  • 현재 장착하고 있는 아이템의 부위를 판단 : 무기 / 방어구 - 투구 / 방어구 - 갑옷 
  • 판단하여 이미 장착하고 있다면, 장착하고 있는 아이템의 장착 해제 정보를 담은 S_EquipItem 패킷 전달
  • 장착한 아이템이 없거나 장착 해제 패킷을 전달한 후에 아이템의 장착 정보를 담은 S_EquipIten 패킷 전달
  • RefreshAdditionalStat 함수를 호출하여 아이템 장착에 따른 능력치 설정

 

1 - 4) GameRoom 클래스

 

HandleEquipItem 함수에서 Player의 HandleEquipItem 함수를 호출하도록 로직을 수정합니다.

 

1 - 5) Arrow 클래스 : 화살이 Job의 개념을 수행

 

Update 함수를 위와 같이 수정합니다.

Job을 추가하는 개념으로 로직을 변경하여 GameRoom의 프레임의 부하를 줄일 수 있습니다.

또, Player의 TotalAttack 프로퍼티를 사용하여 데미지를 계산하도록 수정합니다.

 

1 - 6) GameRoom 클래스

 

EnterGame 함수를 위와 같이 수정합니다.

입장한 플레이어의 RefreshAdditionalStat 함수를 호출하여 능력치를 초기화하고,

입장한 투사체의 Update 함수를 호출하여 설정한 Tick마다 Job을 추가합니다.

 

2) 클라이언트 사이드

2 - 1) MyPlayerController 클래스 : 서버 - 클라이언트와 동일한 구조 유지

 

장착한 아이템으로 변경할 공격력과 방어력을 프로퍼티로 추가합니다.

 

 

 

서버와 동일하게 RefreshAdditonalStat 함수를 호출하여 장착한 아이템을 통해 공격력과 방어력을 증가시킵니다.

또, Init 함수에서 RefreshAdditonalStat 함수를 호출하여 아이템에 따라 증가할 능력치를 초기화합니다.

 

2 - 2) PacketHandler 클래스

 

S_ItemListHandler 함수를 위와 같이 수정하여 갖고 있는 아이템을 클라이언트에 적용한 이후에

아이템을 통해 변경될 능력치를 초기화합니다.

 

 

S_AddItemHandler 함수를 위와 같이 수정하여 아이템을 보상으로 받아 클라이언트에 적용한 이후에

아이템을 통해 변경될 능력치를 초기화합니다.

 

2 - 3) UI_Inventory_Item 클래스

 

Init 함수에 위와 같이 임시 코드를 추가하여 장비가 아닌 아이템의 경우 클릭이벤트를 수행하지 않도록 설정합니다.

 

- 최종 실행 결과

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

728x90
반응형