나만의 작은 도서관

[TIL] 240724 캠프 101일차: 캐릭터 디스폰을 배열로 묶어서 하는 이유, 유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다. 본문

Today I Learn

[TIL] 240724 캠프 101일차: 캐릭터 디스폰을 배열로 묶어서 하는 이유, 유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다.

pledge24 2024. 7. 24. 23:05

오늘 배운 내용                                     

캐릭터 디스폰을 배열로 묶어서 하는 이유

오늘 캐릭터 디스폰과 관련된 작업을 진행하던 중, 클라이언트 코드와 전송 패킷을 보고 의문점이 생겼다. '디스폰은 플레이어의 연결이 끊어졌을 때 발생하는 이벤트인데, 왜 배열로 전송이 될까? 디스폰은 해당 플레이어만 발생할텐데 항상 길이가 1인 배열인 구조로 전송할 필요가 있을까?'

어찌보면 당연한 의문이었다. 디스폰은 접속이 끊어진 유저 한 명당 하나씩 발생하기 때문. 그런데 여기에는 한 가지 숨겨진 고려사항이 있다.

despawn을 클라이언트가 받았을 때 foreach문으로 여러 플레이어를 release하는 것을 볼 수 있다

 

서버는 고유한 주기를 가지고 데이터를 갱신한다.

서버 주도인 통신에서는 서버가 고유한 주기를 가지고 데이터를 갱신한다. 이 주기는 시스템 전체에서 하나만을 가지는 경우가 지배적인데, 이 주기를 통해 클라이언트에게 전송할 패킷을 전송한다. 즉, 디스폰과 관련된 패킷을 클라이언트에게 전송할 때도 해당 주기마다 전송을 하게되며, 주기 사이에 수신된 모든 디스폰 패킷은 모았다가 주기가 돌아왔을 때 한 번에 보내주게 된다. 이러한 이유로 서버가 고유한 주기를 가진다면 서버->클라이언트로 전송하는 디스폰 패킷은 배열 형식으로 가지는 것이 적절하다.

 

유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다.

유니티는 클라이언트, 서버는 node.js로 구현된 이번 최종 프로젝트를 진행하면서 알게된 사실이다. 클라이언트와 서버가 패킷으로 통신을 하려면 정해진 구조인 protoBuf에 대한 데이터를 양 쪽 다 가지고 있어야되는데,(한 쪽은 인코딩, 한 쪽은 디코딩할 때 쓰인다. 반대 또한 그렇다)이 때 인코딩 했을 때 사용한 protoBuf구조와 디코딩에 사용한 protoBuf구조가 다르면 빈 중괄호가 나오게 된다. 그러니 다음부터 유니티에서 Debug.Log()로 패킷에 대한 데이터를 찍었을 때 빈 중괄호가 나오면 서로 다른 protoBuf구조를 사용한 것이 아닌 지 의심해봐야한다,

오늘 한 일                                       

더보기
  • 최종 프로젝트
    • 개발 관련
      • 버그 픽스: 캐릭터 위치 동기화 작업(완료)
      • 리스폰 디스폰 서버 연동 작업(완료)
      • 채팅, 감정 표현 애니메이션 연동 작업 중 마무리 작업 진행
    • 그 외
      • 몬스터/캐릭터 공격에 쓰일 이펙트 정리 페이지 제작
      • 깃헙 프로젝트 설정 업데이트