네트워크 발견
전송 레이어 API 사용(Using the Transport Layer API)

멀티플레이어 로비

Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post and the FAQ.

대부분의 멀티플레이어 게임에는 “로비”, 즉 플레이어가 실제 게임을 플레이하기 전에 잠시 대기하는 게임 내 씬이 있습니다. 로비에서 플레이어는 옵션을 선택하고 게임 준비를 할 수 있습니다.

Unity는 게임에서 로비를 손쉽게 구현할 수 있도록 Network Lobby Manager 컴포넌트를 제공합니다.

Network Lobby Manager 컴포넌트는 Unity 멀티플레이어 게임을 위한 로비를 제공합니다. 여기에는 다음과 같은 기능이 포함됩니다.

  • 로비와 상호작용하기 위한 단순한 빌트인 사용자 인터페이스
  • 참가할 수 있는 플레이어의 인원 수 제한
  • 클라이언트당 다수 플레이어 지원 및 지원 플레이어 수 제한
  • 게임 진행 도중에 플레이어 참여 방지
  • 클라이언트에 “준비” 상태를 지원하여, 모든 플레이어가 준비되었을 때 게임 시작
  • 각 플레이어에 대한 설정 데이터
  • 게임이 끝나면 플레이어가 로비에 다시 참가
  • 로비 이벤트의 커스텀 로직을 지원하는 가상 함수

아래는 Network Lobby Manager 가상 메서드입니다. 자세한 내용은 NetworkLobbyManager 클래스에 대한 API 레퍼런스 문서를 참조하십시오. 클라이언트와 서버에서 호출되는 메서드에 대한 별도 리스트가 제공됩니다. 해당 메서드에 대한 고유한 구현을 작성하여 이러한 이벤트가 발생할 때 조치를 취할 수 있습니다.

서버에서 호출되는 NetworkLobbyManager 가상 함수:

클라이언트에서 호출되는 NetworkLobbyManager 가상 함수:

위에 나열된 모든 서버 및 클라이언트 메서드에는 빈 기본 구현이 포함되어 있습니다. 단, OnLobbyServerPlayersReady****는 제외됩니다. 이 메서드는 PlayScene(로비 관리자 인스펙터의 Play Scene 필드에 할당된 씬)을 사용하여 ServerChangeScene을 호출합니다.

로비 플레이어(Lobby Player) 게임 오브젝트

로비 관리자를 위한 두 가지 종류의 플레이어 프리팹인 Lobby Player Prefab과 ** Game Player Prefab**이 제공됩니다. Network Lobby Manager 컴포넌트에는 각 프리팹에 대한 필드가 있습니다.

Network Lobby Manager 컴포넌트

로비 플레이어 프리팹(Lobby Player Prefab)

Lobby Player Prefab 슬롯에 할당하는 프리팹에는 Network Lobby Player 컴포넌트가 연결되어 있어야 합니다. 로비에 참가하는 각 클라이언트는 Lobby Player Prefab에서 생성된 새 로비 플레이어 게임 오브젝트를 받습니다. Unity는 클라이언트가 연결될 때, 즉 플레이어가 게임에 참가할 때 클라이언트 연결이 해제될 때까지 지속되는 로비 플레이어 게임 오브젝트를 생성합니다.

Network Lobby Player 컴포넌트는 각 플레이어에 대한 “준비” 상태를 유지하고, 로비에 있는 동안 커맨드를 처리합니다. 프리팹에 사용자 스크립트를 추가하여 게임별 플레이어 데이터를 보관할 수도 있습니다.

Network Lobby Player 컴포넌트는 커스텀 로비 동작에 사용할 수 있는 다음과 같은 가상 메서드 콜백을 제공합니다.

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

게임에서 로비에 들어갈 때 Unity는 클라이언트에서 OnClientEnterLobby 메서드를 호출합니다. 이 과정은 로비 씬이 처음 시작하는 시점과 게임플레이 씬에서 로비로 돌아오는 시점에서 발생합니다.

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

해당 플레이어의 준비 상태가 변경될 때 Unity는 클라이언트에서 OnClientReady 메서드를 호출합니다.

게임 플레이어 프리팹(Game Player Prefab)

모든 플레이어가 준비되었다고 표시하면 게임이 시작됩니다. 게임이 시작되면 Unity는 Game Player Prefab을 기반으로 각 플레이어에 대한 게임 오브젝트를 생성합니다. 이 게임 오브젝트는 게임이 끝나거나 플레이어가 로비에 다시 들어갈 때 삭제됩니다. Game Player Prefab은 게임에 있는 동안 커맨드를 처리합니다. 이 프리팹은 네트워크로 연결된 표준 게임 오브젝트이며, Network Identity 컴포넌트에 연결되어 있어야 합니다.

최소 플레이어(Minimum Players)

Network Lobby Manager 컴포넌트에서 Minimum Players 필드는 모두 준비되었을 때 게임을 시작할 수 있는 최소 플레이어 수를 의미합니다. 연결된 클라이언트의 수가 Minimum Players 값보다 큰 경우 연결된 클라이언트가 모두 “준비” 상태가 되면 매치가 시작됩니다.

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

  • 게임 인스턴스 하나가 시작되고 게임이 호스트 모드에서 시작된 경우입니다. 이 경우 게임 로비 인터페이스에서 플레이어가 “Start”를 눌러도 계속 로비에 머무릅니다. 게임을 시작하려면 준비된 플레이어가 두 명 이상이어야 하기 때문입니다.
  • 두 개 이상의 게임 인스턴스를 시작하고, 해당 인스턴스의 클라이언트 모드에서 해당 게임을 시작합니다. 연결된 플레이어(이 예에서는 세 명)가 모두 준비 상태가 될 때까지 기다립니다. 한 플레이어가 로비 UI에서 “Start”를 누릅니다. 이제 두 명의 플레이어가 준비되었지만, 여전히 로비에 머무릅니다. 마지막 플레이어가 로비 UI의 “Start”를 누르면 모든 플레이어가 메인 게임 씬으로 이동합니다.

게임에 로비 추가

다음은 Unity의 빌트인 네트워킹 기능을 사용하여 멀티플레이어 게임에 Network Lobby를 추가하는 기본 프로세스입니다.

  • 로비에 대한 새로운 씬을 생성합니다.
  • 해당 씬을 Build Settings(File > Build Settings… > Add Open Scenes)에서 첫 씬으로 추가합니다.
  • 새로운 씬에 새 게임 오브젝트를 생성하고 LobbyManager로 이름을 변경합니다.
  • Network Lobby Manager 컴포넌트를 LobbyManager 게임 오브젝트에 추가합니다.
  • Network Manager HUD 컴포넌트를 LobbyManager 게임 오브젝트에 추가합니다.
  • Network Lobby Manager 컴포넌트에 대한 인스펙터를 엽니다.
  • Network Lobby Manager에서 LobbyManager 게임 오브젝트가 포함된 씬에 Lobby Scene을 설정합니다.
  • Network Lobby Manager에서 게임의 메인 게임플레이 씬에 Play Scene을 설정합니다.
  • 새 게임 오브젝트를 만들고, 이름을 LobbyPlayer로 변경합니다.
  • Network Lobby Player 컴포넌트를 LobbyPlayer에 추가합니다.
  • LobbyPlayer 게임 오브젝트에 대한 프리팹을 생성하고 씬에서 해당 인스턴스를 삭제합니다.
  • Network Lobby Manager 인스펙터에서 LobbyPlayerPrefab 필드를 LobbyPlayer 프리팹으로 설정합니다.
  • Network Lobby Manager 인스펙터에서 GamePlayerPrefab 필드를 메인 게임의 플레이어용 프리팹으로 설정합니다.
  • 씬을 저장합니다.
  • 게임을 실행합니다.

이 Network Lobby Manager는 매우 간단하게 구현된 버전으로, Network Manager HUD와 유사하게 플레이스홀더 사용자 인터페이스를 사용합니다. 게임을 릴리스하기 전에 게임의 디자인 컨셉과 기능적인 측면에 적합한 고유한 사용자 인터페이스로 교체해야 합니다.

에셋 스토어에서 제공되는 [멀티플레이어 로비 에셋 패키지]((https://www.assetstore.unity3d.com/en/#!/content/41836)에서 잘 만들어진 사용자 인터페이스 예시를 참조하시기 바랍니다.

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

    // for users to apply settings from their lobby player GameObject to their in-game player GameObject
        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 에셋 스토어에서 Network Lobby Manager를 사용하고 로비용 GUI를 제공하는 예제 프로젝트가 제공됩니다. 이 예제 프로젝트를 시작점으로 사용하여 멀티플레이어 게임을 위한 고유 로비를 만들 수 있습니다. 에셋 스토어: 로비 예제 프로젝트를 참조하십시오.

네트워크 발견
전송 레이어 API 사용(Using the Transport Layer API)