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

2D MMO 라이브 서비스 - (1 - 16) 스탯창

monstro 2025. 9. 29. 12:13
728x90
반응형

- 개요

플레이어가 장착한 아이템과 아이템으로 인해 증가한 능력치를 보여주는 스탯창 UI를 작업해보겠습니다.

 

1) 사전 작업 - 서버와 클라이언트의 json 파싱 방식 통일

클라이언트에서 기존에 사용하던 json 파싱 방식이 서버의 json 파싱 방식과 달라

파싱된 데이터가 호환되지 않는 문제가 발생하였습니다.

따라서 이 문제를 수정하였습니다.

 

1 - 1) 서버에서의 작업

 

서버의 Newtonsoft.Json 패키지

 

해당 패키지의 Properties

 

해당 패키지의 Path 값을 복사하여 해당 디렉토리로 이동합니다.

 

lib 폴더의 net45 버전

 

 

Unity와 호환이 가능한 net45 파일로 이동하여 dll 파일을 복사합니다.

 

1 - 2) 클라이언트에서의 작업

Unity 에디터

 

복사한 dll 파일을 프로젝트의 Libs 폴더에 붙여넣기하면 해당 패키지를 Unity에서도 사용할 수 있습니다.

 

2) 클라이언트 사이드

2 - 1) UI_Stat 클래스

두 개의 열거형

 

스탯창 UI를 구성하는 하위 UI들을 의미하는 2개의 열거형을 추가합니다.

  • Images 열거형 : 투구 / 갑옷 / 신발 / 무기 / 방패
  • Texts 열거형 : 플레이어 이름 / 플레이어의 공격력 / 플레이어의 방어력

 

 

초기화 여부를 판단하는 _init 멤버변수를 추가합니다.

또 Init 함수를 오버라이드하고 위와 같이 로직을 구성하였습니다.

Images 열거형과 Texts 열거형을 각각 Image 컴포넌트와 Text 컴포넌트의 GameObject로 연결합니다.

이후 RefreshUI 함수를 호출하여 스탯창 UI를 초기화합니다.

 

 

RefreshUI 함수의 로직은 위와 같습니다.

  • Init 함수가 제대로 수행되지 않았다면, 얼리 리턴
  • 초기화 하기 이전에 착용한 장비를 보여주는 UI의 Image 컴포넌트 비활성화
  • 인벤토리의 아이템을 순회하면서 착용했다면 해당 아이템을 UI에 표시
  • 아이템의 순회가 끝나면 플레이어의 이름 / 플레이어의 최종 공격력 / 플레이어의 방어력 표시

 

2 - 2) UI_InventoryItem 클래스

 

Init 함수에서 아이템을 가져오지 못했다면 얼리리턴하도록 로직을 추가합니다.

 

 

SetItem 함수에서 UI에서 표현할 아이템이 null인 경우에 대비하는 로직을 추가합니다.

 

2 - 3) PacketHandler 클래스

 

S_ItemListHandler 함수와 같이 인벤토리 UI처럼 스탯창 UI도 초기화하는 로직을 추가합니다.

각각 S_AddItemHandler 함수 / S_EquipItemHandler 함수에서 수행합니다.

 

2 - 4) MyPlayerController 클래스

 

GetUIKeyInput 함수에 위와 같이 C키를 누르면 스탯창 UI를 열고 닫는 로직을 추가합니다.

 

2 - 5) DataManager 클래스

 

LoadJson 함수에서 기존의 방식 대신 서버와 동일한 Newtonsoft 패키지를 사용하도록 수정합니다.

 

2 - 6) BaseController 클래스

 

Stat 프로퍼티에서 MergeFrom을 사용하여 대입연산자를 사용하지 않고 값을 설정하도록 수정합니다.

 

- 최종 실행 결과

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

 

728x90
반응형