[TIL] 멀티플레이 게임
멀티플레이와 싱글플레이 차이점
- 싱글: 상태가 내 메모리 하나
- 멀티: 여러 기기에 상태 사본 -> 서로 어긋날 수 있음
핵심 키워드: 동기화, 상태 일관성
동기화가 필요한 이유
- 상태 일관성: 같은 세계를 모두가 같게 봐야함
- 권한: 누가 "진짜"를 정하나 (치트 방지)
- 지연/대역폭: 네트워크는 느리고 좁다 -> 모든 걸 보낼 수 없다
토폴로지: 누가 누구에게 연결되나
- 클라이언트 - 서버: 서버가 데이터/상태의 기준점
- P2P: 참여자들이 서버 없이 클라이언트이자 서버 역할
- Host: 플레이어 중 한 명의 기기가 서버 역할 + 플레이어 역할 동시에 함
권한(Authority) 모델: 누가 진짜를 정하나
- 기본 = 서버 권위: 서버가 결정, 클라이언트는 입력만 보내고 결과를 받음
- 분산 권한: 각 owner가 자기 것을 결정
- owner 권한은 opt-in: 기본 권한이 아닌 필요할 때만 켠다
UGS: Unity Gaming Services
- Authentication: 플레이어 신원(PlayerId/토큰). 다른 서비스의 선행 조건.
- Relay: 공인 IP/포트개방 없이 트래픽을 중계(NAT 우회)
- Lobby: 방 목록·참가자·메타데이터
- Matchmaker: 조건에 맞는 플레이어를 묶어줌
- Multiplayer Services (Sessions): 위의 Lobby+Relay+Matchmaker를 하나로 감싼 통합 API
NGO: Netcode for GameObject
- NetworkManager: 시작/종료, 연결 관리
- NetworkObject: 네트워크에 존재하는 오브젝트
- NetworkBehaviour: 네트워크 스크립트 베이스
- NetworkVariable: 자동 동기화 값
- RPC: 원격 호출(이벤트/명령)
TCP vs UDP
| 항목 | TCP | UDP |
|---|---|---|
| 신뢰성 | 보장(재전송) | 없음(best-effort) |
| 순서 | 보장 | 없음 |
| 연결 | 연결 지향(handshake) | 비연결 |
| 혼잡제어 | 있음 | 없음 |
| 지연 | 변동 큼(재전송 대기) | 낮고 일정 |
| 오버헤드 | 큼 | 작음 |
| 용도 | 웹/파일/로그인 | 실시간 게임/음성/영상 |
게임이 UDP를 쓰는 이유
- 게임은 최신 상태가 과거 상태보다 중요하다. 늦게 도착한 옛 위치 패킷은 쓸모없음
- TCP 의 head-of-line blocking 은 한 패킷 손실이 뒤의 모든 패킷을 막음 → 렉
- UDP 위에 필요한 신뢰성만 선택적으로 얹는 것이 게임의 표준 전략
- Unity Transport (UTP) 는 이 전략의 구현체
- UDP 기반
- 채널(파이프라인)별로 reliable / unreliable / sequenced 를 선택
- NGO 2.x 가 의존하는 기본 전송 계층 (자동 설치)


![[Unity] PC 세이브 데이터 Android로 옮기기](https://data.develog.develrocket.com/upload/develog/muchan/1792206352286-hd4xz4/_____2026-10-17_114953.png)
![[Unity] 제네릭 박싱 예방](https://data.develog.develrocket.com/upload/develog/gmumdev/1792123312021-bhxx2i/_____.png)