NGO(Netcode for GameObjects)와 Relay
핵심 개념
NGO와 Relay는 경쟁 관계가 아니라 함께 사용하는 구성 요소다.
- NGO(Netcode for GameObjects): 게임 상태를 어떻게 동기화할지 담당
- Unity Relay: 인터넷상에서 플레이어들의 연결을 중계
- Unity Transport(UTP): NGO의 데이터를 실제 패킷으로 전송
게임 코드
↓
NGO — RPC·상태 동기화·오브젝트 관리
↓
Unity Transport — 패킷 전송
↓
Unity Relay — NAT·방화벽을 넘어 연결 중계
↓
다른 플레이어
한눈에 보는 비교
| 구분 | NGO | Unity Relay |
|---|---|---|
| 종류 | 고수준 네트워크 라이브러리 | Unity가 운영하는 클라우드 중계 서비스 |
| 주요 역할 | 게임 상태 동기화 | 호스트와 클라이언트 연결 |
| 처리 대상 | RPC, NetworkVariable, 오브젝트 생성·제거, 소유권 | NAT, 방화벽, IP 보호, 패킷 중계 |
| 게임 규칙 실행 | 가능 | 불가능 |
| 카드·체력·턴 동기화 | NGO가 담당 | 전달만 담당 |
| 서버 역할 | Host/Client/Server 구조 제공 | 게임 서버가 아님 |
| 참가 코드 | 직접적인 핵심 기능 아님 | Sessions와 함께 참가 코드 제공 |
| 인터넷 비용 | 라이브러리 자체는 무료 | 무료 한도 이후 사용량 기반 과금 |
| 단독 사용 | LAN·직접 IP 연결 가능 | 게임 상태 동기화 기능이 없어 단독 사용 불가 |
| 음성채팅 | 제공하지 않음 | 음성 전송 용도로 사용하면 안 됨 |
| 설치 패키지 | com.unity.netcode.gameobjects | com.unity.services.multiplayer |
NGO가 담당하는 것
- 방장과 참가자 구분
NetworkObject생성과 제거NetworkVariable상태 동기화- RPC를 통한 행동 요청과 결과 전송
- 오브젝트 소유권 관리
- 네트워크 씬 관리
- 연결·퇴장 이벤트 처리
예시:
클라이언트: “카드 사용 요청”
→ NGO RPC
→ 호스트가 턴과 카드 보유 여부 검사
→ 결과를 NGO로 전체 플레이어에게 전송
Relay가 담당하는 것
직접 IP 방식에서는 공유기 설정, 포트 포워딩, NAT와 방화벽 문제가 발생할 수 있다. Relay는 모든 플레이어가 Unity의 중계 서버에 접속하도록 만들어 이런 문제를 줄인다.
방장이 Relay 세션 생성
→ 참가 코드 발급
→ 친구에게 코드 전달
→ 친구가 코드로 참가
→ Relay를 통해 방장에게 연결
Relay는 게임 결과를 판단하지 않는다. 방장 PC가 여전히 Listen Server이며, Relay는 패킷만 전달한다.
프로젝트 적용 구성
NGO + Unity Transport + Multiplayer Services + Relay
+
Vivox 음성
Unity 6에서는 기존 standalone Relay 패키지 com.unity.services.relay 대신 통합 패키지인 com.unity.services.multiplayer 사용이 권장된다.
- 방장: 비공개 Session 생성 + Relay 연결 + NGO Host 시작
- 참가자: 참가 코드 입력 + Session 참가 + NGO Client 연결
- 게임 판정: 방장 권한
- 공개 로비·매치메이킹: 구현하지 않음
- 음성채팅: Vivox 사용
주의사항
- Relay는 전용 서버가 아니므로 방장이 종료하면 게임도 종료될 수 있다.
- Relay를 사용해도 방장 치팅 가능성은 남는다.
- 카드, 턴, 총 결과처럼 중요한 정보는 Reliable로 전송한다.
- 상체 제스처처럼 일시적인 연출만 필요할 경우 Unreliable을 고려한다.
- 카드 패 등 비공개 정보는 전체
NetworkVariable로 공유하지 않고 대상 플레이어에게만 전송한다. - 음성 데이터를 Relay로 보내지 않는다.
최종 정리
NGO는 게임의 상태와 규칙을 동기화하고, Relay는 그 데이터를 인터넷에서 안전하게 전달한다.
4인 비공개 초대형 게임에는 NGO + Unity Transport + Relay 기반 Listen Server 구성이 적합하며, 커스텀 트랜스포트나 전용 서버는 초기 버전에 필요하지 않다.



