나만의 작은 도서관
[TIL] 240724 캠프 101일차: 캐릭터 디스폰을 배열로 묶어서 하는 이유, 유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다. 본문
[TIL] 240724 캠프 101일차: 캐릭터 디스폰을 배열로 묶어서 하는 이유, 유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다.
pledge24 2024. 7. 24. 23:05오늘 배운 내용
캐릭터 디스폰을 배열로 묶어서 하는 이유
오늘 캐릭터 디스폰과 관련된 작업을 진행하던 중, 클라이언트 코드와 전송 패킷을 보고 의문점이 생겼다. '디스폰은 플레이어의 연결이 끊어졌을 때 발생하는 이벤트인데, 왜 배열로 전송이 될까? 디스폰은 해당 플레이어만 발생할텐데 항상 길이가 1인 배열인 구조로 전송할 필요가 있을까?'
어찌보면 당연한 의문이었다. 디스폰은 접속이 끊어진 유저 한 명당 하나씩 발생하기 때문. 그런데 여기에는 한 가지 숨겨진 고려사항이 있다.
서버는 고유한 주기를 가지고 데이터를 갱신한다.
서버 주도인 통신에서는 서버가 고유한 주기를 가지고 데이터를 갱신한다. 이 주기는 시스템 전체에서 하나만을 가지는 경우가 지배적인데, 이 주기를 통해 클라이언트에게 전송할 패킷을 전송한다. 즉, 디스폰과 관련된 패킷을 클라이언트에게 전송할 때도 해당 주기마다 전송을 하게되며, 주기 사이에 수신된 모든 디스폰 패킷은 모았다가 주기가 돌아왔을 때 한 번에 보내주게 된다. 이러한 이유로 서버가 고유한 주기를 가진다면 서버->클라이언트로 전송하는 디스폰 패킷은 배열 형식으로 가지는 것이 적절하다.
유니티: protoBuf를 잘못 파싱하면 빈 중괄호가 나온다.
유니티는 클라이언트, 서버는 node.js로 구현된 이번 최종 프로젝트를 진행하면서 알게된 사실이다. 클라이언트와 서버가 패킷으로 통신을 하려면 정해진 구조인 protoBuf에 대한 데이터를 양 쪽 다 가지고 있어야되는데,(한 쪽은 인코딩, 한 쪽은 디코딩할 때 쓰인다. 반대 또한 그렇다)이 때 인코딩 했을 때 사용한 protoBuf구조와 디코딩에 사용한 protoBuf구조가 다르면 빈 중괄호가 나오게 된다. 그러니 다음부터 유니티에서 Debug.Log()로 패킷에 대한 데이터를 찍었을 때 빈 중괄호가 나오면 서로 다른 protoBuf구조를 사용한 것이 아닌 지 의심해봐야한다,
오늘 한 일
- 최종 프로젝트
- 개발 관련
- 버그 픽스: 캐릭터 위치 동기화 작업(완료)
- 리스폰 디스폰 서버 연동 작업(완료)
- 채팅, 감정 표현 애니메이션 연동 작업 중 마무리 작업 진행
- 그 외
- 몬스터/캐릭터 공격에 쓰일 이펙트 정리 페이지 제작
- 깃헙 프로젝트 설정 업데이트
- 개발 관련
'Today I Learn' 카테고리의 다른 글
[TIL] 240726 캠프 103일차: 클라이언트가 패킷을 제대로 수신하지 못하고 오류해결(OnRecvCompleted Failed Google.ProtoBuf......) (0) | 2024.07.26 |
---|---|
[TIL] 240725 캠프 102일차: 하이젠버그(Heisenbug)와 console.log (0) | 2024.07.25 |
[TIL] 240723 캠프 100일차: 프로토버프 컴파일러, 유니티 EventSystem (0) | 2024.07.23 |
[TIL] 240722 캠프 99일차: 2D 플랫포머-아틀라스와 애니메이션 (0) | 2024.07.22 |
[TIL] 240719 캠프 96일차: 유니티 2D 플랫포머 게임 제작 준비 (0) | 2024.07.19 |