Version: 2017.1
싱글 플레이어 게임을 Unity 멀티플레이어 게임으로 전환
네트워크 클라이언트와 서버

멀티플레이어 로비(Multiplayer Lobby)

멀티플레이어 게임에는 플레이어들이 실제 게임을 플레이하기 전 참여하여 머무는 영역이 있으며, 보통 이 영역을 “로비”라고 부릅니다. 로비에서 플레이어는 옵션을 선택하고 게임 준비를 할 수 있습니다.

NetworkLobbyManager는 특수한 NetworkManager이며 Unity 멀티플레이어 게임 로비를 제공합니다. 기능은 아래와 같습니다.

  • 참가할 수 있는 플레이어의 인원 수 제한
  • 클라이언트당 다수 플레이어 지원 및 지원 플레이어 수 제한
  • 진행 중인 게임에 플레이어가 참여하는 것 방지
  • 플레이어별 준비 상태를 통해 모든 플레이어가 준비된 경우 게임을 시작
  • 플레이어별 설정 데이터 제공
  • 게임 종료 후 로비에 다시 참여 가능
  • 로비 이벤트의 커스텀 로직을 지원하는 가상 함수
  • 로비와 상호작용하기 위한 단순한 사용자 인터페이스

아래는 서버에서 호출되는 NetworkLobbyManager 가상 함수입니다.

위 서버 함수는 PlayScene에서 ServerChangeScene를 호출하는 OnLobbyServerPlayersReady를 제외하고는 빈 디폴트 구현 상태입니다.

아래는 클라이언트에서 호출되는 NetworkLobbyManager 가상 함수입니다.

위 클라이언트 함수는 모두 빈 디폴트 구현 상태입니다.

로비 플레이어 오브젝트

플레이어 오브젝트는 두 타입이 있으며, 각각 NetworkLobbyManager에 프리팹 슬롯이 있습니다. 아래 스크린샷에서 슬롯을 확인할 수 있습니다.

LobbyPlayer는 플레이어가 로비에 참여할 때 LobbyPlayerPrefab에서 생성됩니다.

  • 각 플레이어당 하나의 LobbyPlayer
  • 클라이언트가 연결하거나 플레이어가 추가될 때 생성
  • 클라이언트가 접속을 해제할 때까지 존재
  • 로비에서 플레이어 준비 플래그를 유지
  • 로비에 있는 동안 커맨드 처리
  • 게임 고유 플레이어 데이터를 유지하기 위해 이 프리팹에 사용자 스크립트 추가
  • 이 프리팹에는 반드시 NetworkLobbyPlayer 컴포넌트가 있어야 합니다.

최소 플레이어(Minimum Players)

Minimum Players 필드는 매치를 시작하기 위해 필요한 로비에서 “Ready” 상태인 플레이어의 최소 숫자를 의미합니다. 연결된 클라이언트의 수가 “최소 플레이어” 값보다 큰 경우, 모든 연결된 클라이언트가 “준비” 상태가 되면 매치가 시작됩니다.

아래는 “최소 플레이어” 수가 2인 경우입니다.

  • 게임 인스턴스 하나가 시작되고 호스트가 시작된 경우입니다. 이 경우 게임 로비 UI에서 플레이어가 Start 를 누르더라도 그 플레이어는 로비 모드에 머물게 됩니다. 게임을 시작하려면 준비된 플레이어가 두 명 이상이어야 하기 때문입니다.
  • 게임 인스턴스가 두 개 이상 시작된 경우입니다. 이 경우 “최소 플레이어”가 2로 설정된 것은 무관하게 되며, 모든 연결된 플레이어가 준비될 때까지 대기하게 됩니다.
  • 로비 UI에서 한 플레이어가 Start 를 누르면 두 플레이어가 Ready 상태지만 로비 모드에 머무르게 됩니다. 마지막 플레이어가 “시작”을 누르면 모든 플레이어가 게임 모드로 이동하게 됩니다.

게임플레이어(GamePlayer)

GamePlayer는 게임이 시작하는 시점에서 GamePlayerPrefab에서 생성됩니다.

  • 각 플레이어당 하나의 GamePlayer
  • 게임 씬이 시작되는 시점에서 생성됨
  • 로비에 다시 입장하면 제거됨
  • 게임에 있는 동안의 명령 처리
  • 이 프리팹에는 반드시 NetworkIdentity 컴포넌트가 있어야 합니다.

NetworkLobbyPlayer 컴포넌트는 LobbyPlayer 오브젝트에서 사용합니다. 커스텀 로비 동작을 위해 사용될 수 있는 일부 가상 함수 콜백을 제공합니다.

    public virtual void OnClientEnterLobby();
        public virtual void OnClientExitLobby();
        public virtual void OnClientReady(bool readyState);

OnClientEnterLobby 함수는 게임에서 로비에 진입할 때 클라이언트에서 호출됩니다. 이 과정은 로비 씬이 처음 시작하는 시점과 게임플레이 씬에서 로비로 돌아오는 시점에서 발생합니다.

OnClientExitLobby 함수는 게임이 로비에서 나갈 때 클라이언트에서 호출됩니다. 이 과정은 게임플레이 씬으로 전환할 때 발생합니다.

OnClientReady 함수는 해당 플레이어의 준비 상태가 변경되는 경우 호출됩니다.

게임에 로비 추가

멀티플레이어 로비 에셋 패키지를 사용하지 않고 NetworkLobby를 멀티플레이어 게임에 추가하는 과정

  • 새 로비 씬을 생성합니다.
  • 해당 씬을 Build Settings (메뉴: File > Build Settings…)에서 첫 씬으로 추가합니다.
  • 새로운 씬에 게임 오브젝트를 생성하고 (메뉴: GameObject > Create Empty), LobbyManager 로 이름붙이십시오.
  • NetworkLobbyManager 컴포넌트를 LobbyManager 게임 오브젝트에 추가합니다.
  • NetworkManagerHUD 컴포넌트를 LobbyManager 게임 오브젝트에 추가합니다.
  • NetworkLobbyManager 컴포넌트 인스펙터 창에서 NetworkLobbyManger의 Lobby Scene 슬롯을 LobbyManager 게임 오브젝트를 포함하는 씬으로 설정합니다.
  • NetworkLobbyManager의 Play Scene 슬롯을 게임의 메인 게임플레이 씬으로 설정합니다.
  • 새 게임 오브젝트를 만들고, 이름을 LobbyPlayer 로 변경합니다.
  • NetworkLobbyPlayer 컴포넌트를 LobbyPlayer 에 추가합니다.
  • LobbyPlayer의 프리팹을 프로젝트 창으로 드래그하여 생성하고, 씬에서 이 인스턴스를 삭제합니다.
  • LobbyManager 의 NetworkLobbymanager 컴포넌트에서 LobbyPlayer 프리팹을 Lobby Player Prefab 슬롯에 할당합니다.
  • 메인 게임 플레이어의 프리팹을 Game Player Prefab 슬롯에 할당합니다.
  • 씬을 저장합니다.
  • 게임을 실행합니다.

이 버전의 NetworkLobbyManager는 NetworkManagerHUD와 같은 OnGUI 사용자 인터페이스를 사용합니다. 멀티플레이어 로비 에셋 패키지를 사용해서 사용자 인터페이스를 개선할 수 있습니다. 패키지는 Unity 포럼 NetworkStarter 샘플 패키지에 있습니다.

NetworkLobbyManager는 커스텀 로비 동작에 사용할 수 있는 많은 가상 함수 콜백을 포함하고 있습니다. 그 중 가장 중요한 콜백은 OnLobbyServerSceneLoadedForPlayer입니다. 이 콜백은 각 플레이어가 로비에서 메인 게임을 전환하는 시점에서 호출됩니다. 이 콜백에서 로비 설정을 플레이어 오브젝트에 적용하는 것이 이상적입니다.

    // for users to apply settings from their lobby player object to their in-game player object
    
        public override bool OnLobbyServerSceneLoadedForPlayer(GameObject lobbyPlayer, GameObject gamePlayer)
        {
            var cc = lobbyPlayer.GetComponent<ColorControl>();
            var player = gamePlayer.GetComponent<Player>();
            player.myColor = cc.myColor;
            return true;
        }

예제 프로젝트

Unity 에셋 스토어에는 NetworkLobbyManager를 사용하고 로비 GUI를 제공하는 예제 프로젝트가 있습니다. 이 프로젝트를 시작점으로 활용하여 로비가 있는 멀티플레이어 게임을 만들 수 있습니다.

로비 예제 프로젝트

싱글 플레이어 게임을 Unity 멀티플레이어 게임으로 전환
네트워크 클라이언트와 서버