[Unity] 멀티 플레이 구현
![[Unity] 멀티 플레이 구현](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fuser_1777093328305%2F1782543609370-dhldb2%2F_____2026-06-27_155852.png&w=3840&q=75)
개요
유니티에서 멀티 플레이 구현하기 위한 세팅과 예제 코드를 작성해봤다
연습해보기

우선 유니티 프로젝트를 클라우드로 만들게 되면

Project Settings -> Services -> Unity Project ID에 코드가 생긴 것을 볼 수 있다

cloud.unity.com에 접속해서도 확인할 수 있다
NetworkManager
NetworkManager는 NGO의 핵심 싱글톤으로 멀티플레이 세션 전체를 담당한다
네트워크 세션의 시작/종료, 클라이언트 연결 관리, NetworkObject 스폰, 씬 동기화 등을 모두 담당한다.
세가지 실행모드
| 모드 | 설명 | 시작 메서드 |
|---|---|---|
| Host | 서버 + 클라이언트를 겸함. 방장이 직접 플레이하는 구조 | StartHost() |
| Server | 전용 서버. 게임에 직접 참여하지 않음 | StartServer() |
| Client | 서버에 접속하는 참여자 | StartClient() |
주요 프로퍼티
- .Singleton: 전역 싱글톤 접근
- .IsHost: 호스트 여부
- .IsServer: 서버 여부
- .IsClient: 클라이언트 여부
- IsListening: 현재 연결 수신 중 여부
- ConnectedClientsIds: 연결된 클라이언트 ID 목록
- LocalClientId: 자기 자신의 클라이언트 ID
주요 콜백 이벤트
- .OnClientConnectedCallback: 누군가 접속했을 때
- .OnClientDisconnectCallback: 누군가 접속 종료했을 때
콜백은 OnEnable에서 등록하고 OnDisable에서 반드시 해제해야 메모리 누수를 막을 수 있다.
Shutdown 주의사항
Shutdown() 호출 후에는 NGO가 씬 로드를 더 이상 구동하지 않으므로, 로비로 돌아가려면 NGO의 씬 관리가 아닌 UnityEngine.SceneManagement.SceneManager로 직접 로드해야 한다
m_NetworkManager.Shutdown();
SceneManager.LoadScene("LobbyScene"); // 직접 로드
NetworkManager 컴포넌트

빈 게임 오브젝트를 만들고 NetworkManager 컴포넌트를 추가한다
여기서 Network Topology를 보면 Client Server 구조임을 알 수 있다
Unity Transport

NetworkManager의 실제 패킷 전송을 담당하는 컴포넌트
NGO 자체는 "무엇을 보낼지"만 결정하고 실제 "어떻게 보낼지"는 이 컴포넌트가 처리한다
테스트

Window - Multiplayer - Multiplayer Play Mode를 선택해서

Player2를 체크하면

다른 Game 씬이 나오게 된다

플레이 해서 한쪽 Game Scene에서는 Host, 다른 Game Scene에서는 Client로 접속할 수 있다



![[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)