다른 핸들러는 다 정상적으로 클라이언트에게 proto 패킷이 디코딩 되어서 페이로드가 도착하는데, 특정 패킷만 Null로
도착하는 증상이 있었다.
1. 의심 해 볼만한 것은 proto 파일이 양측간 최신화가 안되어있다는 점
2. 메시지 형식이 맞지 않는 점
3. 신에게 미움산 점
유니티 클라이언트에서 Proto를 역직렬화 하는 방법은 protoc 배치파일을 통하여 cs파일로 변환한 후 사용하고 있다.
따라서 이 부분을 서버 것으로 다시 만들어서 최신화를 해주었는데 동일하게 Null로 넘어왔다.
양측 간 메세지 형식도 동일하고 자료형도 같은 것을 확인했다. protoc로 생성된 cs가 문제가 생겼을수도 있어서 직접 열어서 다 조회했는데 문제는 없었다.
클라이언트가 문제가 없다면 서버에서 문제가 발생했단 소리인데, 패킷 인코딩하는 부분이 다른 핸들러는 작동을 잘하는데 특정 핸들러만 문제가 있는 것을 봐서 인코딩 부분을 다시 살펴봤다.
if (!PACKET_TYPE_REVERSED[Type]) throw new Error('Invalid Packet Type');
const typeName = PACKET_TYPE_REVERSED[Type];
const camel = snakeToCamel(typeName);
const response = {
[camel]: data,
};
const payload = GamePacket.encode(response).finish();
패킷타입명을 받아서 카멜형식으로 변환 후 패킹하고 페이로드를 GamePacket에서 찾아서 인코딩 시키는 방식으로 구현해놓았었는데, 알고보니... Proto 파일 내 페이로드명이 잘못 되어 있었다...
S2CHealUnitNotification HealUnitNotification = 1001
만들어진 response는 healUnitNotification
으로 패킹되었는데 HealUnitNotification
으로 인코딩 하려고 하니
찾지 못하는 증상이었던 것이다.. 맨 앞 대문자로 인해..
그래도 찾아서 해결하였다.