중요: UNet은 지원이 중단된 솔루션이며, 새로운 멀티플레이어 및 네트워킹 솔루션(MLAPI)이 개발 중입니다. 자세한 내용과 다음 단계는 Unity MLAPI 웹사이트에 있는 정보를 참조하십시오. |
대부분의 멀티플레이어 게임에는 “로비”, 즉 플레이어가 실제 게임을 플레이하기 전에 잠시 대기하는 게임 내 씬이 있습니다. 로비에서 플레이어는 옵션을 선택하고 게임 준비를 할 수 있습니다.
Unity는 게임에서 로비를 손쉽게 구현할 수 있도록 Network Lobby Manager 컴포넌트를 제공합니다.
Network Lobby Manager 컴포넌트는 Unity 멀티플레이어 게임을 위한 로비를 제공합니다. 여기에는 다음과 같은 기능이 포함됩니다.
아래는 Network Lobby Manager 가상 메서드입니다. 자세한 내용은 NetworkLobbyManager 클래스에 대한 API 레퍼런스 문서를 참조하십시오. 클라이언트와 서버에서 호출되는 메서드에 대한 별도 리스트가 제공됩니다. 해당 메서드에 대한 고유한 구현을 작성하여 이러한 이벤트가 발생할 때 조치를 취할 수 있습니다.
서버에서 호출되는 NetworkLobbyManager
가상 함수:
클라이언트에서 호출되는 NetworkLobbyManager
가상 함수:
위에 나열된 모든 서버 및 클라이언트 메서드에는 빈 기본 구현이 포함되어 있습니다. 단, OnLobbyServerPlayersReady**
는 제외됩니다. 이 메서드는 PlayScene(로비 관리자 인스펙터의 Play Scene** 필드에 할당된 씬)을 사용하여 ServerChangeScene을 호출합니다.
로비 관리자를 위한 두 가지 종류의 플레이어 프리팹인 Lobby Player Prefab과 ** Game Player Prefab**이 제공됩니다. Network Lobby Manager 컴포넌트에는 각 프리팹에 대한 필드가 있습니다.
Network Lobby Manager 컴포넌트
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 메서드를 호출합니다.
모든 플레이어가 준비되었다고 표시하면 게임이 시작됩니다. 게임이 시작되면 Unity는 Game Player Prefab을 기반으로 각 플레이어에 대한 게임 오브젝트를 생성합니다. 이 게임 오브젝트는 게임이 끝나거나 플레이어가 로비에 다시 들어갈 때 삭제됩니다. Game Player Prefab은 게임에 있는 동안 커맨드를 처리합니다. 이 프리팹은 네트워크로 연결된 표준 게임 오브젝트이며, Network Identity 컴포넌트에 연결되어 있어야 합니다.
Network Lobby Manager 컴포넌트에서 Minimum Players 필드는 모두 준비되었을 때 게임을 시작할 수 있는 최소 플레이어 수를 의미합니다. 연결된 클라이언트의 수가 Minimum Players 값보다 큰 경우 연결된 클라이언트가 모두 “준비” 상태가 되면 매치가 시작됩니다.
아래는 “최소 플레이어” 수가 2인 경우입니다.
다음은 Unity의 빌트인 네트워킹 기능을 사용하여 멀티플레이어 게임에 Network Lobby를 추가하는 기본 프로세스입니다.
이 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를 제공하는 예제 프로젝트가 제공됩니다. 이 예제 프로젝트를 시작점으로 사용하여 멀티플레이어 게임을 위한 고유 로비를 만들 수 있습니다. 에셋 스토어: 로비 예제 프로젝트를 참조하십시오.