(TIL) 2025-01-10
트러블 슈팅
배경
과제 도전 기능 중 유저가 게임을 종료 했을 때 마지막 위치를 데이터 베이스에 위치를 저장하고 재접속을 했을 때 해당 위치에 재접속을 해야하는 기능이 있다. 게임을 종료 했을 때 저장 기능을 구현하고 테스트 하는 과정에서 유니티에서 테스트 했을 때와 빌드된 게임에서 테스트 했을 때 각각의 다른 문제가 발생했다.
유니티
게임을 종료하면 소켓이 종료되어 서버에서 ‘end’ 이벤트가 실행이 될거라고 생각을 했으니 어떠한 오류도 없이 서버에서 PING핸들러의 Interval로 패킷 송신처리가 유지되고 있었다.
전혀 예상하지 못한 오류가 발생하였고 그것도 각자 결과가 다르다는 것에 멘붕이 왔다.
원인/분석
인터넷으로 찾아본 결과 GameManager에서 OnApplicationPause() 함수를 이용하면 종료시 해당 함수가 호출이 되어 처리가 가능하다고 해서 해당 함수를 추가하고 로그까지 찍어보았다.
1
2
3
4
5
void OnApplicationPause()
{
Debug.Log("### OnApplicationPause");
GameQuit();
}
테스트 결과 종료를 해도 해당 함수가 호출되지 않고 다시 Play 했더니 OnApplicationPause 실행이된건지 로그가 출력되었다.
해당 방법으로 해결을 못하여 다른 방법을 찾기위해 우선 게임을 종료했음에도 Interval로 PING 패킷을 전송하는 로그가 계속 출력되고 있는 것을 알 수 있었기에 해당 부분을 주석을 처리하여 테스트를 해보았다.
1
2
3
4
ping() {
const now = Date.now();
// this.socket.write(createPingPacket(now));
}
빌드된 게임에서는 정상적으로 소켓 ‘end’ 이벤트가 호출되었지만 유니티에서는 어떠한 이벤트도 발생하지 않았다.
이번에는 ‘close’ 이벤트를 추가하여 테스트를 진행을 해보았다.
1
socket.on("close", onClose(socket));
빌드된 게임에서 게임을 끄면 error 이벤트와 close 이벤트 2개가 각각 호출되는 것을 확인 할 수 있었다. 하지만 유니티는 어떠한 이벤트도 호출되지 않았다.
결론
해당 오류에 대해서 명확한 해결을 못하였지만 튜터님께 문의 하였더니 한가지 새로운 것을 알게 되었다. 우선 유니티에서 Play를 종료했을 때 PING Interval로 TCP통신이 유지되고 있었던 것은 TCP연결이 유니티 어플케이션과 연결이 되어 있다는 것이다. 유니티 프로그램은 종료를 한게 아니니 유지가 되었던 것이고 유니티 프로그램을 종료 했더니 ‘end’ 이벤트가 호출되는 것을 확인 할 수 있었다. 즉 빌드된 게임은 게임을 종료 했기에 더이상 프로그램이 없어서 Interval이 통신이 오류가 발생하여 ‘err’ 이벤트가 호출 되었던 것이다. 그리고 빌드된 게임인 게임 어플리케이션을 종료 했기에 연결이 완전히 종료되어 ‘close’ 이벤트가 호출된 것이다.





