Здравствуйте, я работаю над своей первой многопользовательской игрой, так что я совсем новичок в этой теме.
Я разрабатываю игру только с двумя сценами: Menu и Main. Когда пользователь нажимает кнопку «Play», я загружаю основную сцену и запускаю лобби (если уже существует какое-либо другое лобби, я пытаюсь присоединиться). Но если пользователь вернется в меню, я хочу вообще уничтожить лобби, а игрок на другой стороне должен обработать OnClientDisconnectCallback.
Сейчас ситуация такова - если игрок вернется в меню, ничего не происходит. Если какой-либо из игроков вообще выключит игру, то OnClientDisconnectCallback будет обрабатываться. Как правильно "сбросить лобби" при уходе со сцены Main?
Для мультиплеера использую UGS: Relay и Lobby
Это мой код для инициализации моего LobbyManager:
private void Awake()
{
if (SceneManager.currentScene == SceneHelper.MENU)
{
if (NetworkManager.Singleton != null)
{
NetworkManager.Singleton.Shutdown();
Destroy(NetworkManager.Singleton.gameObject);
}
return;
}
LobbyManager._instance = this;
}
private async void Start()
{
if (SceneManager.currentScene != SceneHelper.MAIN)
return;
// Initialize unity services
await UnityServices.InitializeAsync();
// Setup events listeners
this.SetupEvents();
// Unity Login
await SignInAnonymouslyAsync();
// Subscribe to NetworkManager events
NetworkManager.Singleton.OnClientConnectedCallback += this.ClientConnected;
NetworkManager.Singleton.OnClientDisconnectCallback += this.ClientDisconnected;
this.FindMatch();
}
А это мой код который вызывается когда LobbyManager уничтожается:
private async void OnDestroy()
{
// We need to delete the lobby when we're not using it
Debug.Log("Destroying");
NetworkManager.Singleton.Shutdown();
string playerId = AuthenticationService.Instance.PlayerId;
await LobbyService.Instance.RemovePlayerAsync(_lobbyId, playerId);
await Lobbies.Instance.DeleteLobbyAsync(_lobbyId);
AuthenticationService.Instance.SignOut();
}
Еще заметил что если быстро выйти в меню и снова нажать кнопку Play то происходит присоединение к лобби от которого только что отключился (хотя оно должно удалиться через await Lobbies.Instance.DeleteLobbyAsync(_lobbyId); )