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

2D MMO 라이브 서비스 - (1 - 4) Player 연동 (2)

monstro 2025. 9. 2. 11:35
728x90
반응형

- 개요

클라이언트가 서버에 연결된 이후 로그인 - 로비 입장 - 게임 접속까지의 과정을 처리해보도록 하겠습니다.

처리는 다음의 과정으로 이루어져 있습니다.

  • 1) 클라이언트에서 서버로 C_Login 패킷 전송
  • 2) 서버에서 클라이언트로 S_Login 패킷 전송
  • 3) 클라이언트에서 서버로  C_Create 패킷 전송 -> 해당 클라이언트의 캐릭터들 생성 요청
  • 4) 서버에서 클라이언트로 S_Create 패킷 전송 -> 로비 UI에 캐릭터들 생성하여 배치
  • 5) 클라이언트에서 서버로 C_EnterGame 패킷 전송 -> 선택하여 생성한 캐릭터로 게임 입장 요청

 

위의 과정중에서 2) ~ 5)를 처리해보겠습니다.

 

1) 서버 사이드

1 - 1) ClientSession 클래스

 

기존의 OnConnected 함수에서 절차와 맞지 않는 캐릭터를 생성하는 로직을 제거합니다.

해당 로직은 ClientSession_PreGame 스크립트에서 대신 수행하도록 합니다.

 

1 - 2) ClientSession_PreGame 클래스

 

2가지 멤버 변수를 추가합니다.

  • AccountDbId : 로그인한 클라이언트의 AccountDbId 캐싱
  • LobbyPlayers : 로비에 존재하는 플레이어들 캐싱

 

 

클라이언트의 로그인을 핸들링하는 HandleLogin 함수를 위와 같이 수정하였습니다.

우선, LobbyPlayers 멤버변수를 사용하기 이전에 비워주는 로직을 추가하였습니다.

이후의 로직은 다음과 같습니다.

  • 로그인한 클라이언트의 계정을 DB에서 찾은 경우
    • 해당 계정에 속해있는 플레이어들을 로비에 배치
    • 클라이언트의 접속 상태를 ServerStateLobby로 변경
  • 로그인한 클라이언트의 계정을 DB에서 찾지 못한 경우
    • 해당 계정을 DB에 새롭게 추가
    • 클라이언트의 접속 상태를 ServerStateLobby로 변경

 

 

게임에 입장하는 클라이언트의 캐릭터의 생성을 핸들링하는 HandleCreatePlayer 함수를 추가하였습니다.

로직은 다음과 같습니다.

  • 생성할 캐릭터가 DB에 이미 존재하는 경우
    • S_CreatePlayer 패킷 생성하여 전송
  • 생성할 캐릭터가 DB에 존재하지 않는 경우
    • 우선 DB에 1레벨의 스탯을 생성
    • 다음으로 메모리에 1레벨의 스탯을 생성
    • 스탯이 설정된 캐릭터를 생성하고 S_CreatePlayer 패킷 생성하여 전송

 

 

클라이언트의 생성된 캐릭터의 게임 입장을 핸들링하는 HandleEnterGame 함수를 위와 같이 추가하였습니다.

DB에서 입장할 캐릭터를 찾고 좌표를 설정하여 GameRoom에 입장시킵니다.

 

1 - 3) PacketHandler 클래스

 

클라이언트로부터 전송된 C_Create 패킷에 대응하는 C_CreatePlayerHandler 함수입니다.

ClientSession으로부터 HandleCreatePlayer 함수를 호출하여 캐릭터를 생성합니다.

 

 

클라이언트로부터 전송된 C_EnterGame 패킷에 대응하는 C_EnterGameHandler 함수입니다.

ClientSession으로부터 HandleEnterGame 함수를 호출하여 생성한 캐릭터를 게임에 입장시킵니다.

 

2) 클라이언트 사이드

2 - 1) PacketHandler 클래스

 

서버로부터 전송된 S_Login 패킷에 대응하는 S_LoginHandler 함수를 위와 같이 수정하였습니다.

로직은 다음과 같습니다.

  • 로그인한 클라이언트의 캐릭터가 DB에 없는 경우 : 랜덤한 이름의 캐릭터를 생성
  • 로그인한 클라이언트의 캐릭터가 DB에 있는 경우 : 해당 클라이언트의 첫번째 캐릭터로 게임에 입장

 

 

서버로부터 전송된 S_CreatePlayer 패킷에 대응하는 S_CreatePlayerHandler 함수를 추가하였습니다.

로직은 다음과 같습니다.

  • 생성할 캐릭터가 없는 경우 : 랜덤한 이름값을 가진 캐릭터를 생성
  • 생성할 캐릭터가 있는 경우 : 해당 캐릭터를 사용하여 게임에 입장

 

- 최종 실행 결과

클라이언트

 

서버

 

위와 같이 플레이어가 생성된 것을 확인할 수 있습니다.

728x90
반응형