You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.5 KiB
C#

3 weeks ago
using System;
using System.Threading.Tasks;
using UnityEngine;
namespace Unity.BossRoom.ConnectionManagement
{
/// <summary>
/// Connection state corresponding to when a client is attempting to connect to a server. Starts the client when
/// entering. If successful, transitions to the ClientConnected state. If not, transitions to the Offline state.
/// </summary>
class ClientConnectingState : OnlineState
{
protected ConnectionMethodBase m_ConnectionMethod;
public ClientConnectingState Configure(ConnectionMethodBase baseConnectionMethod)
{
m_ConnectionMethod = baseConnectionMethod;
return this;
}
public override void Enter()
{
#pragma warning disable 4014
ConnectClientAsync();
#pragma warning restore 4014
}
public override void Exit() { }
public override void OnClientConnected(ulong _)
{
m_ConnectStatusPublisher.Publish(ConnectStatus.Success);
m_ConnectionManager.ChangeState(m_ConnectionManager.m_ClientConnected);
}
public override void OnClientDisconnect(ulong _)
{
// client ID is for sure ours here
StartingClientFailed();
}
void StartingClientFailed()
{
var disconnectReason = m_ConnectionManager.NetworkManager.DisconnectReason;
if (string.IsNullOrEmpty(disconnectReason))
{
m_ConnectStatusPublisher.Publish(ConnectStatus.StartClientFailed);
}
else
{
var connectStatus = JsonUtility.FromJson<ConnectStatus>(disconnectReason);
m_ConnectStatusPublisher.Publish(connectStatus);
}
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
}
internal async Task ConnectClientAsync()
{
try
{
// Setup NGO with current connection method
await m_ConnectionMethod.SetupClientConnectionAsync();
// NGO's StartClient launches everything
if (!m_ConnectionManager.NetworkManager.StartClient())
{
throw new Exception("NetworkManager StartClient failed");
}
}
catch (Exception e)
{
Debug.LogError("Error connecting client, see following exception");
Debug.LogException(e);
StartingClientFailed();
throw;
}
}
}
}