Синхронизация Mutliplayer на зеркале и unity

#android #unity3d #multiplayer #mirror #vuzix

Вопрос:

Я пытаюсь создать приложение, в котором я отправляю ввод с моего устройства Android на сервер, т. Е. на свой компьютер, к которому подключен Arduino. Таким образом, ПК(сервер) отправляет входные данные в Arduino. Но, используя зеркало, у меня возникают небольшие трудности с синхронизацией данных. Я могу подключить как сервер, так и клиент, но я не могу отправлять данные с клиента на сервер или с сервера на клиент. Я тоже пробовал обучающие программы YouTube и [Команду], но мне кажется, что я что-то упускаю. Я просто хочу отправить команду с клиента на сервер, чтобы она отправилась в Arduino. Если кто-нибудь сможет помочь, это будет очень важно. Код для скрипта выглядит следующим образом

 using System.Collections.Generic;
using UnityEngine;
using Mirror;
using TMPro;
public class syncData : NetworkBehaviour
{

    public GameObject DFA;

    public TMP_Text data1;
    public TMP_Text data2;
    public TMP_Text data3;
    [SyncVar]
   
    string receivedString;

    public delegate void StringChangedDelegate(string receivedString);


    /*[SyncEvent]*/
    public event StringChangedDelegate EventStringChanged;

    private void SetString(string receivedString)
    {
        receivedString = DFA.GetComponent<Comunicacion>().receivedstring;


    }
    public override void OnStartServer()
    {
        SetString(receivedString);


    }
    // Start is called before the first frame update
    void Start()
    {
        //  DFA = GameObject.FindWithTag("dfa"); // tag, not name
    }
    /*    [Command]
        private void changeString() => SetString(receivedString);
    */

    // Update is called once per frame
 //   [ClientCallBack]
    void Update()
    {
    //    Debug.Log("Client is sending information.");
    //    receivedString = DFA.GetComponent<Comunicacion>().receivedstring;
        refresh(receivedString);
    }

    [Server]
    void FunctionServer()
    {
        Debug.Log("Running the program in Server mode.");
    }
    [ClientRpc]
    void refresh(string receivedString)
    {

        //   receivedString = DFA.GetComponent<Comunicacion>().receivedstring;

        if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.B))
        {
            Debug.Log(" Right Arrow Button was pressed on Vuzix");

        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.X))
        {
            Debug.Log(" Left Arrow Button was pressed on Vuzix");
        }
        refresher();
    //    string[] datos = receivedString.Split(':'); //My arduino script returns a 3 part value (IE: 12,30,18)
     ////   data1.SetText(datos[0]);//       Try to forcefully re-enter values from DFA
     //   data2.SetText(datos[1]);
     //   data3.SetText(datos[2]);
    }

    [Command]
    void refresher()
    {
     //   receivedString = DFA.GetComponent<Comunicacion>().receivedstring;
        refresh(receivedString);
        Debug.Log("A command has been sent");

        //    gm.Update()
    }
}
 

Комментарии:

1. зачем вам отправлять RPC каждый кадр ? Кроме того, если это работает на клиенте, это не сработает … [ClientRpc] может быть вызван только сервером , а затем выполняется на всех клиентах … не могли бы вы немного убрать беспорядок прокомментированного кода и объяснить, чего именно вы пытаетесь достичь?

2. я пытаюсь отправить команду B с клиента на сервер. но это никогда не проходит. когда я нажимаю b, он отправляет u на arduino, где arduino запускает сервопривод в соответствии с этой кнопкой. но это происходит только на сервере, для клиента я не могу ничего отправлять на сервер или с сервера на клиент.