- 개요
클라이언트가 로그인에 성공하면 로비에 입장하게 된다
로비에서는 다음의 기능을 클라이언트에게 제공한다
- 점수를 기준으로 상위 9명의 플레이어의 이름 + 점수 + 접속여부를 보여주는 UI
- 접속해 있는 다른 플레이어와의 매칭하여 대결할 수 있는 버튼
- 게임에서 로그아웃할 수 있는 버튼
- 게임에 접속중인 전체 플레이어의 수
따라서 클라이언트는 서버에게 서버의 상태를 받아와야 할 필요가 있다
받아온 서버의 상태를 사용하여 접속한 플레이어에게 정보를 제공한다
- 클라이언트 사이드
1) 클라이언트의 PacketType 클래스

PacketType 클래스에 클라이언트에서 서버로 전송하여 서버의 상태를 수신받도록 요청하기 위한 패킷의 타입을 추가한다
2) 클라이언트의 Net_ServerStatusRequest 클래스

Net_ServerStatusRequest 클래스는 클라이언트가 서버로 전송하는 패킷으로 서버의 상태를 수신받기 위해 사용한다
구성은 위와 같으며 Type 프로퍼티를 ServerStatusRequest 타입으로 설정한다
이후 Serialize 함수에 로직을 추가하여 패킷에 Type 프로퍼티를 기록하고 패킷을 직렬화한다
3) NetworkClient 클래스

Awake 함수에 위와 같이 로직을 추가하여
로그인 씬에서 로비 씬으로 전환되어도 기존의 NetworkClient를 유지할 수 있도록 설정한다
4) UI_Lobby 클래스

로비 씬의 UI를 담당하는 UI_Lobby 클래스를 생성한다
UI_Base 클래스를 상속받아 구현하며 로그인 UI와 동일하게 enumNumbers 멤버변수를 사용하여
UI를 구성하는 GameObject들의 이름과 연결된 정수값을 사용하여 바인드된 오브젝트들을 탐색할 수 있도록 설정한다

열거형 멤버들의 구성은 위와 같다
- GameObjects_Btn : 매칭될 적을 탐색하는 버튼 / 로그아웃 버튼
- GameObjects_Vlg : 상위 9명의 플레이어들을 보여주는 Vertical Layout Group
- GameObjects_Text : 현재 접속중인 전체 유저들의 수

Awake 함수는 위와 같이 구성하였다
GenerateEnumsSerialNumber 함수를 호출하여 클래스의 열거형들의 멤버들을 enumNumbers 멤버변수에 저장하고,
열거형들의 멤버들을 GameObject로 바인드한다

Start 함수는 위와 같이 구성하였다
RequestServerStatus 함수를 호출하여 새로운 Net_ServerStatusRequest 패킷 인스턴스를 생성하고
서버로 해당 패킷을 전송한다
- 서버 사이드
1) 서버의 PacketType 클래스

클라이언트와 동일하게 ServerStatusRequest의 패킷 타입을 추가한다
2) 서버의 Net_ServerStatusRequest 클래스

클라이언트와 동일하게 Net_ServerStatusRequest 패킷 클래스를 구성한다
3) Net_OnServerStatus 클래스

플레이어의 정보를 전달하기위한 DTO로 사용할 PlayersNetDto 구조체를 추가한다
프로퍼티의 구성은 위와 같다
- 플레이어의 이름
- 플레이어의 점수
- 플레이어의 접속여부
멤버함수의 구성은 다음과 같다
- Deserialize 함수 : 패킷을 역직렬화하여 이름 + 점수 + 접속여부를 읽어와 프로퍼티에 설정
- Serialize 함수 : 이름 + 점수 + 접속여부의 프로퍼티를 패킷에 작성하고 패킷을 직렬화

Net_OnServerStatus 클래스에 위와 같이 2개의 멤버변수를 추가한다
- PlayersCount : 플레이어의 수
- TopPlayers : 상위 9명의 플레이어의 정보

Deserialize 함수의 로직은 위와 같다
- 역직렬화된 패킷으로부터 정보를 가져와 PlayersCount 프로퍼티를 설정
- 다시한번 정보를 가져와 상위 플레이어들의 수를 가져오고 topPlayersLength 변수로 설정
- topPlayersLength 만큼 TopPlayers 프로퍼티의 크기를 설정
- 순회하면서 TopPlayers 프로퍼티의 값을 설정

Serialize 함수의 로직은 위와 같다
- 패킷에 패킷의 타입을 기록
- 패킷에 플레이어의 수를 기록
- 패킷에 상위 플레이어들의 수를 기록
- 패킷에 상위 플레이어들의 정보를 기록하고 패킷 직렬화
4) UsersManager 클래스

GetTopPlayers 함수를 추가하여 점수를 기준으로 상위 9명의 플레이어의 정보를 반환한다
5) ServerStatusRequestHandler 클래스

클라이언트로부터 수신된 Net_ServerStatusRequest 패킷에 대응하는 핸들러 클래스를 위와 같이 생성한다
멤버변수의 구성은 다음과 같다
- 네트워크 서버
- DB를 대신하여 플레이어 정보를 메모리에 저장하는 IRepository 인스턴스
- 플레이어 매니저

생성자에서는 멤버변수를 설정한다

Handle 함수의 로직은 위와 같다
새로운 Net_OnServerStatus 패킷을 생성하고 해당 패킷의 값을 설정한다
이후 설정된 패킷을 클라이언트로 전송한다
6) AuthRequestHandler 클래스

AuthRequestHandler 클래스에 IUserRepository 멤버변수를 추가하고
생성자에서 인자를 추가로 받아 해당 멤버변수를 설정한다

NotifyOtherPlayers 함수에 위와 같이 로직을 추가하여
새로운 Net_OnServerStatus 패킷을 생성 + 설정하고 다른 플레이어들에게도 전송한다
'유니티 엔진 - 게임 프로젝트 > 데디케이트 기반 모바일 게임' 카테고리의 다른 글
| 로비 구현 - 3) ParrelSync 패키지의 사용 + 플레이어간의 퇴장 동기화 (0) | 2025.12.16 |
|---|---|
| 로비 구현 - 2) 상위 점수 플레이어 정보 + 접속중인 플레이어 정보 사용 (0) | 2025.12.16 |
| 사용자 인증 - 최종) 클라이언트의 패킷 핸들링 (0) | 2025.12.02 |
| 사용자 인증 - 2) 로그인한 사용자 핸들링 (0) | 2025.12.02 |
| 사용자 인증 - 1) 사용자 저장 (0) | 2025.12.01 |