플레이어 이동 동기화 구현
TCP 기반 데디케이티드 서버를 통한 멀티플레이어 이동 동기화 기능 구현
1. 네트워크 프로토콜 설계
3. TCP 서버 구현
4. Unity 클라이언트 구현
주요 이슈
Issue #1: JSON 직렬화 라이브러리 불일치
문제: Unity는 Newtonsoft.Json, Server는 System.Text.Json
해결: 각 플랫폼에 맞는 PacketSerializer 별도 구현
Issue #2: Int2 직렬화 실패
문제:
"TargetGridPos": {} // 값이 비어있음
원인:
- Unity
JsonUtility는 Property 직렬화 안 함 (Field만)
- Server
System.Text.Json은 Field 직렬화 안 함 (Property만)
해결:
- Unity
Int2: Field 사용 (public int X;)
- Server
Int2: Property 사용 (public int X { get; set; })
- 대소문자 통일 (X, Y - 대문자)
결과:
"TargetGridPos": {"X":-6, "Y":-8}
Issue #3: TCP 패킷 경계 문제
문제: 여러 패킷이 합쳐져서 파싱 오류
현재 상태: 가끔 발생, 대부분 정상 작동
TODO: 다음 단계에서 패킷 길이 헤더 추가 예정
Issue #4: PlayerId가 항상 0
문제: Unity에서 전송하는 PlayerId가 0
현재 상태: 서버는 정상 작동, 단일 플레이어 테스트 문제없음
TODO: 다음 단계에서 수정 예정
테스트 결과
서버 로그:
크레이지 아케이드 서버 시작! 포트 12345
[접속] 플레이어 1
[전송] 플레이어 1에게 게임 상태 전송
[디버그] 받은 JSON: {"Type":10,"PlayerId":0,"TargetGridPos":{"X":-6,"Y":-8}}
[이동] 플레이어 1: (-6, -8)
Unity 로그:
서버 연결 성공!
내 플레이어 ID: 1
이동 전송: (-6, -8)
이동 전송: (-7, -8)
성능
- 지연시간: ~10ms (로컬)
- 패킷 크기: ~100-200 bytes (JSON)
- 처리 속도: 초당 수백 개 패킷 처리 가능
변경된 파일
신규 파일
Server/
├── Program.cs (신규)
├── NetworkPacket.cs (신규)
├── NetworkPackets.cs (신규)
├── PacketSerializer.cs (신규)
├── Int2.cs (Unity에서 복사)
├── PlayerState.cs (Unity에서 복사)
└── PlayerStats.cs (Unity에서 복사)
UnityProject/CrazyArcade/Assets/Scripts/
├── Network/ (신규 폴더)
│ ├── NetworkClient.cs (신규)
│ ├── NetworkPacket.cs (신규)
│ ├── NetworkPackets.cs (신규)
│ └── PacketSerializer.cs (신규)
└── GameCore/
└── Int2.cs (수정 - Field로 변경)
수정된 파일
PlayerMove.cs - NetworkClient 연동 추가
Int2.cs - Property → Field, 대소문자 통일
.gitignore - Server 빌드 파일 제외 추가
다음 단계
후속 작업
비고
핵심은 Unity/Server 간 JSON 직렬화 차이 해결
- Unity는 Field만 직렬화
- Server는 Property만 직렬화
- 두 방식 모두 호환되도록 설계
1. JSON 직렬화 플랫폼 차이
- Unity
JsonUtility: Field만, 가볍고 빠름
- .NET
System.Text.Json: Property 기본, 유연함
- 크로스 플랫폼 시 신중한 선택 필요
2. TCP 스트림 특성
- 패킷 경계 없음 (스트림 기반)
- 길이 헤더 또는 구분자 필요
- 여러 패킷이 한 번에 읽힐 수 있음
3. Unity-Server 코드 공유 전략
- 데이터 구조는 공유 가능
- 직렬화 코드는 플랫폼별 구현
- 조건부 컴파일
#if UNITY 활용
Related: #물풍선동기화이슈 #방시스템이슈
플레이어 이동 동기화 구현
TCP 기반 데디케이티드 서버를 통한 멀티플레이어 이동 동기화 기능 구현
1. 네트워크 프로토콜 설계
PacketTypeenum)Connect- 접속Disconnect- 퇴장PlayerMove- 이동 요청PlayerState- 상태 업데이트GameState- 전체 게임 상태NetworkPacket- 기본 패킷PlayerMovePacket- 이동 패킷PlayerStatePacket- 상태 패킷ConnectPacket/DisconnectPacketGameStatePacket- 초기 게임 상태JsonUtility사용System.Text.Json사용3. TCP 서버 구현
ConcurrentDictionary)4. Unity 클라이언트 구현
NetworkClient.cs- 네트워크 통신 담당127.0.0.1:12345)Dictionary<ulong, GameObject>로 관리PlayerMove.cs수정주요 이슈
Issue #1: JSON 직렬화 라이브러리 불일치
문제: Unity는 Newtonsoft.Json, Server는 System.Text.Json
해결: 각 플랫폼에 맞는
PacketSerializer별도 구현Issue #2: Int2 직렬화 실패
문제:
원인:
JsonUtility는 Property 직렬화 안 함 (Field만)System.Text.Json은 Field 직렬화 안 함 (Property만)해결:
Int2: Field 사용 (public int X;)Int2: Property 사용 (public int X { get; set; })결과:
Issue #3: TCP 패킷 경계 문제
문제: 여러 패킷이 합쳐져서 파싱 오류
현재 상태: 가끔 발생, 대부분 정상 작동
TODO: 다음 단계에서 패킷 길이 헤더 추가 예정
Issue #4: PlayerId가 항상 0
문제: Unity에서 전송하는 PlayerId가 0
현재 상태: 서버는 정상 작동, 단일 플레이어 테스트 문제없음
TODO: 다음 단계에서 수정 예정
테스트 결과
서버 로그:
Unity 로그:
성능
변경된 파일
신규 파일
수정된 파일
다음 단계
후속 작업
비고
핵심은 Unity/Server 간 JSON 직렬화 차이 해결
1. JSON 직렬화 플랫폼 차이
JsonUtility: Field만, 가볍고 빠름System.Text.Json: Property 기본, 유연함2. TCP 스트림 특성
3. Unity-Server 코드 공유 전략
#if UNITY활용Related: #물풍선동기화이슈 #방시스템이슈