public async void updateState(bool v, string sessionID)
    {
        if (_socket == null)
        {
            await createSocket();
        }

        if (_socket.IsConnected)
        {
            NakamaCommand nakamaCommand = new NakamaCommand();

            nakamaCommand.command   = "update_state";
            nakamaCommand.isALive   = v;
            nakamaCommand.sessionId = sessionID;

            var ns = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(nakamaCommand));

            //Debug.Log(JsonUtility.ToJson(nakamaCommand));
            //Debug.Log(ns);

            await _socket.SendMatchStateAsync(_match.Id, 1, ns);
        }
        else
        {
            await _socket.ConnectAsync(_session);

            updateState(v, sessionID);
        }
    }
    public async void updatePosition(Vector3 position, Quaternion rotation, float speed, string skin)
    {
        if (_socket == null)
        {
            await createSocket();
        }

        if (_socket.IsConnected)
        {
            NakamaCommand nakamaCommand = new NakamaCommand();

            nakamaCommand.command  = "move_character";
            nakamaCommand.position = position;
            nakamaCommand.rotation = rotation;
            nakamaCommand.speed    = speed;
            nakamaCommand.skin     = skin;

            var ns = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(nakamaCommand));

            //Debug.Log(JsonUtility.ToJson(nakamaCommand));
            //Debug.Log(ns);

            await _socket.SendMatchStateAsync(_match.Id, 1, ns);
        }
        else
        {
            await _socket.ConnectAsync(_session);

            updatePosition(position, rotation, speed, skin);
        }
    }
    public async void updatePosition(float h, float v)
    {
        if (_socket == null)
        {
            await createSocket();
        }

        if (_socket.IsConnected)
        {
            NakamaCommand nakamaCommand = new NakamaCommand();

            nakamaCommand.command = "move_character";
            nakamaCommand.h       = h;
            nakamaCommand.v       = v;

            var ns = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(nakamaCommand));

            Debug.Log(JsonUtility.ToJson(nakamaCommand));
            Debug.Log(ns);

            await _socket.SendMatchStateAsync(_match.Id, 1, ns);
        }
        else
        {
            await _socket.ConnectAsync(_session);

            updatePosition(h, v);
        }
    }
    public async Task <bool> startMatch()
    {
        if (_socket == null)
        {
            await createSocket();
        }

        if (_socket.IsConnected)
        {
            NakamaCommand nakamaCommand = new NakamaCommand();

            nakamaCommand.command = "start_game";

            var ns = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(nakamaCommand));

            Debug.Log(JsonUtility.ToJson(nakamaCommand));
            Debug.Log(ns);

            await _socket.SendMatchStateAsync(_match.Id, 1, ns);

            // ui.SendMessage("startGame", "Local");
            return(true);
        }
        else
        {
            await _socket.ConnectAsync(_session);

            startMatch();
        }
        return(false);
    }
    public void updateCharacterState(NakamaCommand state)
    {
        PlayerController g = _characters.Find(l => l.gameObject.name == "Player_" + state.sessionId);

        if (g != null)
        {
            g.isALive = state.isALive;
        }
    }
    public void updateCharacterPosition(NakamaCommand state)
    {
        Vector3          position = state.position;
        Quaternion       rotation = state.rotation;
        PlayerController g        = _characters.Find(l => l.gameObject.name == "Player_" + state.sessionId);

        if (g != null)
        {
            g.transform.position = position;
            g.transform.rotation = rotation;
            g.animator.SetFloat("speed", state.speed);
        }
        else
        {
            CreateCharacterWithoutController(state.sessionId, position, rotation, state.skin);
        }
    }
    public void updateCharacterPosition(NakamaCommand state)
    {
        Vector3          position = state.position;
        Quaternion       rotation = state.rotation;
        PlayerController g        = _characters.Find(l => l.gameObject.name == "Player_" + state.sessionId);

        if (g != null)
        {
            //g.h = state.h;
            //g.v = state.v;
            //g.movPlayer = position;
            //g.move = true;
            g.transform.position = position;
            g.transform.rotation = rotation;
        }
        else
        {
            CreateCharacterWithoutController(state.sessionId, position, rotation);
        }
    }