[Unity] 멀티 플레이 구현

muchan
muchan
∙∙조회 15
[Unity] 멀티 플레이 구현

개요

유니티에서 멀티 플레이 구현하기 위한 세팅과 예제 코드를 작성해봤다

연습해보기

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

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로 직접 로드해야 한다

scss
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로 접속할 수 있다