Hi, I get this error when I tried to create lobby.
Problem occurs like this.
-I simply initialize services then in SignIn callback I create lobby. It creates lobby without problem.
-Then I exit playmode. It disposes lobby and removes all players bind to that lobby.
-On second time I enter play mode and repeat first step, I get error at LobbyService.Instance.CreateLobbyAsync();
Here’s my Authentication Code.
private static async Task<bool> TryInitServicesAsync(string profileName = null)
{
if (UnityServices.State == ServicesInitializationState.Initialized)
return true;
//Another Service is mid-initialization:
if (UnityServices.State == ServicesInitializationState.Initializing)
{
var task = WaitForInitialized();
if (await Task.WhenAny(task, Task.Delay(InitTimeout)) != task)
return false; // We timed out
return UnityServices.State == ServicesInitializationState.Initialized;
}
if (profileName != null)
{
//ProfileNames can't contain non-alphanumeric characters
Regex rgx = new Regex("[^a-zA-Z0-9 - _]");
profileName = rgx.Replace(profileName, "");
var authProfile = new InitializationOptions().SetProfile($"{profileName}{LocalProfileTools.LocalProfileSuffix}");
//If you are using multiple unity services, make sure to initialize it only once before using your services.
await UnityServices.InitializeAsync(authProfile);
}
else
await UnityServices.InitializeAsync();
return UnityServices.State == ServicesInitializationState.Initialized;
async Task WaitForInitialized()
{
while (UnityServices.State != ServicesInitializationState.Initialized)
await Task.Delay(100);
}
}
public static async Task<bool> TrySignInAndCreateLobbyAsync(string profileName = null)
{
if (!await TryInitServicesAsync(profileName))
return false;
Debug.Log("Unity service initialized");
AuthenticationService.Instance.SignedIn += async () =>
{
Debug.Log($"Signed in as {AuthenticationService.Instance.PlayerId}");
LobbyManager.Instance.InitializeLocalUser(AuthenticationService.Instance.PlayerId, profileName);
// Create the lobby
LobbyManager.Instance.CreateLobby($"{LobbyManager.Instance.LocalPlayer.DisplayName.Value}'s room.");
};
AuthenticationService.Instance.SignInFailed += (RequestFailedException e) =>
{
GlobalMenuManager.Instance.FocusMenu(MenuEnum.AuthenticateMenu);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Reason: ");
stringBuilder.AppendLine(e.Source);
stringBuilder.Append("Message: ");
stringBuilder.AppendLine(e.Message);
OutputHandler.Instance.ShowOneWayOutput($"Error {e.ErrorCode}", stringBuilder.ToString(), () =>
{
Debug.Log("Sign-in failed: " + e.Message);
TrySignInAndCreateLobbyAsync();
});
};
if (_isSigningIn)
{
var task = WaitForSignedIn();
if (await Task.WhenAny(task, Task.Delay(InitTimeout)) != task)
return false; // We timed out
return AuthenticationService.Instance.IsSignedIn;
}
_isSigningIn = true;
await AuthenticationService.Instance.SignInAnonymouslyAsync();
_isSigningIn = false;
return AuthenticationService.Instance.IsSignedIn;
async Task WaitForSignedIn()
{
while (!AuthenticationService.Instance.IsSignedIn)
await Task.Delay(100);
}
}
And Here’s my LobbyManager
public void InitializeLocalUser(string playerId, string username)
{
_localPlayer.ID.Value = playerId;
_localPlayer.DisplayName.Value = username;
}
public async Task<Lobby> CreateLobbyAsync(string lobbyName, int maxPlayers, bool isPrivate, LocalPlayer localUser)
{
if (_createCooldown.IsCoolingDown)
{
Debug.LogWarning("Create lobby hit the rate limit.");
return null;
}
await _createCooldown.QueueUntilCooldown();
CreateLobbyOptions createLobbyOptions = new CreateLobbyOptions()
{
IsPrivate = isPrivate,
Player = CreatePlayer(localUser),
Data = new Dictionary<string, DataObject>()
{
{ QueueTypeKey, new DataObject(DataObject.VisibilityOptions.Member, ((int)QueueType.Solo).ToString() ) }
}
};
_joinedLobby = await LobbyService.Instance.CreateLobbyAsync(lobbyName, maxPlayers, createLobbyOptions);
StartHeartBeat();
return _joinedLobby;
}
I followed sample code comes with Lobby package so there is similarities.