- 개요
승리한 플레이어가 서버로 PlayAgainRequest 패킷을 전송하여 새로운 게임을 다시 플레이하자고 요청하면
서버에서 OnPlayAgain 패킷을 클라이언트로 전송하여 새로운 게임을 다시 플레이하기 위한 UI를 설정한다
- 서버 + 클라이언트 공용
1) PacketType 클래스

2개의 새로운 패킷 타입을 추가한다
- PlayAgainRequest 패킷 : 클라이언트에서 서버로 전송하여 게임을 새롭게 다시 시작하자고 요청
- OnPlayAgain 패킷 : 서버에서 클라이언트로 전송하여 새로운 게임을 다시 시작
2) Net_PlayAgainRequest 클래스

클라이언트가 서버로 전송하는 Net_PlayAgainRequest 패킷 클래스를 생성한다
Type 프로퍼티의 값을 위와 같이 설정한다
Serialize 함수를 오버라이드하여 패킷의 타입을 기록하여 직렬화하도록 설정한다
3) Net_OnPlayAgain 클래스

서버가 클라이언트로 전송하는 Net_OnPlayAgain 패킷 클래스를 생성한다
Type 프로퍼티의 값을 위와 같이 설정한다
Serialize 함수를 오버라이드하여 패킷의 타입을 기록하여 직렬화하도록 설정한다
- 서버 사이드
1) Game 클래스

SetRematchReadiness 함수를 새롭게 추가한다
인자로 받은 userId로부터 PlayerType을 가져와 어떤 플레이어가 새로운 게임 시작을 요청하는지 설정한다
2) PlayAgainRequestHandler 클래스

클라이언트로부터 수신받은 PlayAgainRequest 패킷을 핸들링하는 핸들러 클래스를 생성한다
멤버변수의 구성은 위와 같다
- _usersManager 멤버변수 : 유저를 관리 + 접근하기 위한 UsersManager 인스턴스
- _gameManager 멤버변수 : 게임을 관리 + 접근하기 위한 GameManager 인스턴스
- _networkServer 멤버변수 : 패킷을 전송하기 위한 NetworkServer 인스턴스

생성자를 위와 같이 구성하여 멤버변수의 값을 설정한다

Handle 함수를 위와 같이 오버라이드한다
- 인자로 받은 값을 사용하여 ServerConnection + userId + Game을 가져와 저장
- 어떤 플레이어가 새로운 게임을 플레이하기를 원하는지 판단
- 새로운 Net_OnPlayerAgain 패킷을 생성하고 새로운 게임을 원하는 플레이어의 상대 플레이어에게 전송
- 클라이언트 사이드
1) OnPlayAgainHandler 클래스

서버로부터 수신받은 OnPlayAgain 패킷을 핸들링하기 위한 핸들러 클래스를 생성한다
멤버변수로 OnPlayAgain 액션을 갖고 있도록 하여 원하는 시점에서 바인드된 콜백함수를 호출한다

Handle 함수를 위와 같이 오버라이드하여 OnPlayAgain 액션에 바인드된 콜백함수를 호출한다
2) UI_EndRound 클래스

OnEnable 함수에 새로운 로직을 추가한다
- _btnPlayAgain 오브젝트의 Button 컴포넌트 탐색 + onClick 이벤트에 RequestPlayAgain 함수 바인드
- OnPlayAgainHandler의 OnPlayAgain 액션에 HandlePlayAgainRequset 함수 바인드
- 일시적으로 크기가 커지는 애니메이션 추가

OnDisable 함수를 위와 같이 오버라이드하여 바인드한 콜백함수들을 전부 제거한다

RequestPlayAgain 함수의 로직은 위와 같다
새로운 게임을 요청하는 버튼을 비활성화 + 상대방을 대기하는 텍스트를 활성화한다
이후 새로운 Net_PlayAgainRequest 패킷을 생성하고 서버로 전송한다

HandlePlayAgainRequest 함수의 로직은 위와 같다
새로운 게임을 승낙하는 버튼을 활성화 + 새로운 게임을 알려주는 텍스트를 활성화한다
이후 게임 결과에 따라 팝업되는 UI의 높이를 약간 보정한다
- 최종 실행 결과
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
'유니티 엔진 - 게임 프로젝트 > 데디케이트 기반 모바일 게임' 카테고리의 다른 글
| 게임종료 구현 - 4) 항복 구현 (0) | 2026.01.27 |
|---|---|
| 게임종료 구현 - 3) 게임 재시작 구현 (0) | 2026.01.26 |
| 게임종료 구현 - 1) 게임 결과에 따른 종료 UI (0) | 2026.01.20 |
| 인게임 구현 - 최종) 플레이어 턴 텍스트 수정 + 승리 애니메이션 (0) | 2026.01.12 |
| 인게임 구현 - 5) 서버와 클라이언트의 마커 결과 핸들링 (0) | 2026.01.07 |