private void Connect()
        {
            if (socketClient != null && (socketClient.IsConnected || socketClient.IsConnecting))
            {
                Disconnect();
                socketClient = null;
            }

            switch (type)
            {
            case Type.Ssl:
                var sslContext = sslCertificateAsset.GetContext();
                socketClient = new UnitySslClient(sslContext, serverIp, serverPort);
                break;

            case Type.Tcp:
                socketClient = new UnityTcpClient(serverIp, serverPort);
                break;

            case Type.Udp:
                socketClient = new UnityUdpClient(serverIp, serverPort);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            buffer = new byte[socketClient.OptionReceiveBufferSize];

            socketClient.OnConnectedEvent    += OnConnected;
            socketClient.OnDisconnectedEvent += OnDisconnected;
            socketClient.OnErrorEvent        += OnError;
            socketClient.ConnectAsync();
        }
        private async void ReconnectDelayedAsync()
        {
            await Task.Delay((int)(reconnectionDelay * 1000));

            if (socketClient.IsConnected || socketClient.IsConnecting)
            {
                return;
            }

            Debug.Log("Trying to reconnect");
            socketClient.ConnectAsync();
        }