멀티플레이어 게임에는 플레이어들이 실제 게임을 플레이하기 전 참여하여 머무는 영역이 있으며, 보통 이 영역을 “로비”라고 부릅니다. 로비에서 플레이어는 옵션을 선택하고 게임 준비를 할 수 있습니다.
NetworkLobbyManager는 특수한 NetworkManager이며 Unity 멀티플레이어 게임 로비를 제공합니다. 기능은 아래와 같습니다.
아래는 서버에서 호출되는 NetworkLobbyManager 가상 함수입니다.
위 서버 함수는 PlayScene에서 ServerChangeScene
를 호출하는 OnLobbyServerPlayersReady
를 제외하고는 빈 디폴트 구현 상태입니다.
아래는 클라이언트에서 호출되는 NetworkLobbyManager 가상 함수입니다.
위 클라이언트 함수는 모두 빈 디폴트 구현 상태입니다.
플레이어 오브젝트는 두 타입이 있으며, 각각 NetworkLobbyManager에 프리팹 슬롯이 있습니다. 아래 스크린샷에서 슬롯을 확인할 수 있습니다.
LobbyPlayer는 플레이어가 로비에 참여할 때 LobbyPlayerPrefab에서 생성됩니다.
Minimum Players 필드는 매치를 시작하기 위해 필요한 로비에서 “Ready” 상태인 플레이어의 최소 숫자를 의미합니다. 연결된 클라이언트의 수가 “최소 플레이어” 값보다 큰 경우, 모든 연결된 클라이언트가 “준비” 상태가 되면 매치가 시작됩니다.
아래는 “최소 플레이어” 수가 2인 경우입니다.
GamePlayer는 게임이 시작하는 시점에서 GamePlayerPrefab에서 생성됩니다.
NetworkLobbyPlayer 컴포넌트는 LobbyPlayer 오브젝트에서 사용합니다. 커스텀 로비 동작을 위해 사용될 수 있는 일부 가상 함수 콜백을 제공합니다.
public virtual void OnClientEnterLobby();
public virtual void OnClientExitLobby();
public virtual void OnClientReady(bool readyState);
OnClientEnterLobby 함수는 게임에서 로비에 진입할 때 클라이언트에서 호출됩니다. 이 과정은 로비 씬이 처음 시작하는 시점과 게임플레이 씬에서 로비로 돌아오는 시점에서 발생합니다.
OnClientExitLobby 함수는 게임이 로비에서 나갈 때 클라이언트에서 호출됩니다. 이 과정은 게임플레이 씬으로 전환할 때 발생합니다.
OnClientReady 함수는 해당 플레이어의 준비 상태가 변경되는 경우 호출됩니다.
멀티플레이어 로비 에셋 패키지를 사용하지 않고 NetworkLobby를 멀티플레이어 게임에 추가하는 과정
이 버전의 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를 제공하는 예제 프로젝트가 있습니다. 이 프로젝트를 시작점으로 활용하여 로비가 있는 멀티플레이어 게임을 만들 수 있습니다.