Почему мой сервер не выполнит команду, отправленную клиентом в Unity 5.1?

Я работаю над очень простой /базовой клиент-серверной сетевой программой, основой будущей игры, которую я надеюсь создать. Теперь клиентская программа /проект успешно соединяется с «серверной программой /проектом» (оба полностью разделены). Однако, когда дело доходит до отправки клиентом запроса /команды на сервер. Ну, он не отправляет команду на сервер, он выполняет ее на клиенте.

Я читал об изменении наследования «Monodevelop» на «NetworkBehaviour», поэтому я сделал это, и это привело к ошибке в строках:

Команда xxx была отправлена ​​на сервер ... Debug.logerror (объект Так что, похоже, я получил половину пути, он якобы отправил команду на сервер, но сервер ничего не сделал с ней. Я не знаю, почему.

Ниже приведены относительно короткие программы, которые у меня есть для моего сервера и клиента, и они почти одинаковы, но если кто-нибудь сможет мне помочь, я бы очень признателен, поскольку мой университетский курс действительно не попадал в Сеть Программирование всего этого;

Код сервера

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class server : MonoBehaviour
{

    public string IP = "127.0.0.1";
    public int port = 25001;
    public int prevConns = 0;
    private int currConns = 0;

    public virtual void OnServerReady (NetworkConnection conn)
    {
        NetworkServer.SetClientReady (conn);
    }

    void OnGUI ()
    {
        if (Network.peerType == NetworkPeerType.Disconnected) {
            if (GUI.Button (new Rect (100, 100, 100, 25), "Start Client")) {
                Network.Connect (IP, port);
            }
            if (GUI.Button (new Rect (100, 125, 100, 25), "Start Server")) {
                Network.InitializeServer (20, port, false);
            }
        } else {
            //CLIENT - NOT NEEDED
            if (Network.peerType == NetworkPeerType.Client) {
                GUI.Label (new Rect (100, 100, 100, 25), "Client");
                if (GUI.Button (new Rect (100, 125, 100, 25), "Disconnect")) {
                    Network.Disconnect (250);
                }
            }
            if (Network.peerType == NetworkPeerType.Server) {               
                currConns = Network.connections.Length;
                GUI.Label (new Rect (100, 100, 100, 25), "Server");
                GUI.Label (new Rect (100, 125, 100, 25), "Connections: " + currConns);

                if (prevConns != currConns) {
                    if (prevConns < currConns) {
                        Debug.Log ("NEW CONNECTION");
                        prevConns++;

                    } else if (prevConns > currConns) {
                        Debug.Log ("Lost CONNECTION");
                        prevConns--;
                    }
                }

                if (GUI.Button (new Rect (100, 15, 100, 25), "Shutdown")) {
                    Network.Disconnect (250);
                }
            }
        }
    }

}

Код клиента

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class connection : MonoBehaviour
{

    public string IP = "127.0.0.1";
    public int port = 25001;
    public GameObject player;

    public virtual void OnClientConnect (NetworkConnection conn)
    {
        ClientScene.Ready (conn);
    }

    void OnGUI ()
    {
        if (Network.peerType == NetworkPeerType.Disconnected) {
            if (GUI.Button (new Rect (100, 100, 100, 25), "Start Client")) {
                Network.Connect (IP, port);
            }
        } else {
            if (Network.peerType == NetworkPeerType.Client) {
                GUI.Label (new Rect (100, 100, 100, 25), "Client");
                if (GUI.Button (new Rect (100, 125, 100, 25), "Disconnect")) {
                    Network.Disconnect (250);
                }

                if (GUI.Button (new Rect (100, 150, 100, 25), "Send Cmd")) {
                    CmdSendCommand ();
                }

            }
        }
    }

    [Command]
    void CmdSendCommand ()
    {
        NetworkBehaviour.print ("HELLO");
    }
}
5 голосов | спросил NeoKuro 17 J0000006Europe/Moscow 2015, 00:22:14

2 ответа


5

В соответствии с документацией, [Command] и [ClientRpc] должен быть в NetworkBehaviour, а не в MonoBehaviour. NetworkBehaviour необходимо создать с помощью NetworkServer.Spawn() , Кроме того, вы должны использовать код NetworkClient Object подключитесь к Серверу.

Взгляните на это

Примечание. . Что касается автономной документации Unity 5.1, не обновляется. Даже некоторые аспекты онлайн-документации вводят в заблуждение. Именно так я его реализовал.

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
using System.Collections.Generic;

public class MatchMaker : MonoBehaviour
{
    public MatchManager matchManager;
    public string ip = "127.0.0.1";
    public int port = 2349;

    NetworkClient client;

    bool showGUI = true;
    bool isServer = false;
    int clientLimit = 1;
    int curretCount = 0;

    private static MatchMaker instance;

    public static MatchMaker Instance { get { return instance; } }

    public List<Player> players;

    const short PLAYER_SYNC_AFTER = 1203;
    const short PLAYER_SYNC_BEFORE = 1205;
    const short GRID_MESSAGE_X = 1240;
    const short GRID_MESSAGE_Y = 1230;
    const short PLAY = 1440;

    public int sizeX;
    public int sizeY;

    public static bool networkSpawn = false;

    void Awake ()
    {
        instance = this;
        players = new List<Player> ();
    }

    void OnGUI ()
    {
        if (isServer && networkSpawn) {
            if (GUILayout.Button ("Play"))
                Play ();
        }

        if (!showGUI)
            return;

        if (GUILayout.Button ("Host Game"))
            HostGame ();
        if (GUILayout.Button ("Join Game"))
            JoinGame ();
    }

    public void Play ()
    {
        matchManager.gm.BeginGame ();
        NetworkServer.SendToAll (PLAY, new EmptyMessage ());
        NetworkServer.ClearHandlers ();
    }

    public void HostGame ()
    {
        NetworkServer.Listen (port);
        NetworkServer.RegisterHandler (MsgType.Connect, OnClientConnected);
        NetworkServer.RegisterHandler (PLAYER_SYNC_AFTER, OnRecievePlayerAfter);
        // HACK Can Changer Server Side Players
        players.Add (new HumanPlayer (Color.green, "Host"));
        showGUI = false;
        isServer = true;
        sizeX = 15;
        sizeY = 10;
    }

    public void JoinGame ()
    {
        client = new NetworkClient ();
        client.RegisterHandler (MsgType.Connect, OnServerConnected);
        client.RegisterHandler (PLAYER_SYNC_AFTER, OnRecievePlayerAfter);
        client.RegisterHandler (PLAYER_SYNC_BEFORE, OnRecievedPlayerBefore);
        client.RegisterHandler (GRID_MESSAGE_X, OnGridSizeX);
        client.RegisterHandler (GRID_MESSAGE_Y, OnGridSizeY);
        client.RegisterHandler (PLAY, (NetworkMessage msg) => {
            matchManager.gm.BeginGame ();
            client.UnregisterHandler (MsgType.Connect);
            client.UnregisterHandler (PLAYER_SYNC_AFTER);
            client.UnregisterHandler (PLAYER_SYNC_BEFORE);
            client.UnregisterHandler (GRID_MESSAGE_X);
            client.UnregisterHandler (GRID_MESSAGE_Y);
            client.UnregisterHandler (PLAY);
        });                           
        client.Connect (ip, port);

        // TODO Cutomize Client
        players.Add (new HumanPlayer (Color.yellow, "CLient"));
        showGUI = false; 
    }

    void OnServerConnected (NetworkMessage msg)
    {       
        client.Send (PLAYER_SYNC_AFTER, new PlayerMessage{ color = players [0].color, name = players [0].name });
        Debug.Log ("Server Connected");
    }

    void OnClientConnected (NetworkMessage msg)
    {
        Debug.Log ("Client Connected");
        foreach (var player in players)
            NetworkServer.SendToClient (msg.conn.connectionId, PLAYER_SYNC_BEFORE, new PlayerMessage {
            name = player.name,
            color = player.color
        });

        NetworkServer.SetClientReady (msg.conn);

        curretCount++;
        if (curretCount == clientLimit) {
            NetworkServer.SendToAll (GRID_MESSAGE_X, new IntegerMessage { value = 15});
            NetworkServer.SendToAll (GRID_MESSAGE_Y, new IntegerMessage { value = 10});
            NetworkServer.SpawnObjects ();
            networkSpawn = true;
        }
    }

    void OnRecievePlayerAfter (NetworkMessage msg)
    {
        var playerMessage = msg.ReadMessage<PlayerMessage> ();
        players.Add (new NetworkPlayer (playerMessage.color, playerMessage.name));

        if (!isServer)
            return;

        foreach (var conn in NetworkServer.connections)
            if (conn != null && conn.connectionId != msg.conn.connectionId)
                NetworkServer.SendToClient (conn.connectionId, PLAYER_SYNC_AFTER, new PlayerMessage {
                name = playerMessage.name,
                color = playerMessage.color
            });
    }

    void OnRecievedPlayerBefore (NetworkMessage msg)
    {
        var playerMessage = msg.ReadMessage<PlayerMessage> ();
        players.Insert (players.Count - 1, new NetworkPlayer (playerMessage.color,         playerMessage.name));
    }

    void OnGridSizeX (NetworkMessage msg)
    {
        sizeX = msg.ReadMessage<IntegerMessage> ().value;
    }

    void OnGridSizeY (NetworkMessage msg)
    {
        sizeY = msg.ReadMessage<IntegerMessage> ().value;
    }

    public class PlayerMessage : MessageBase
    {
        public string name;
        public Color color;
    }
}

Здесь My NetworkBehaviour для ClientRpc и Command

using UnityEngine;
using UnityEngine.Networking;
using System.Collections.Generic;

public class MatchManager : NetworkBehaviour
{
    public NetworkGameManager gm;
    public bool canSpawn = false;

    public void UpdateCell (int x, int y, LineDirection lineDirection)
    {
        if (isServer)
            RpcUpdateCell (x, y, lineDirection);
        else {
            CmdUpdateCell (x, y, lineDirection);
        }
    }

    [ClientRpc]
    public void RpcUpdateCell (int x, int y, LineDirection lineDirection)
    {
        gm.UpdateCell (x, y, lineDirection);
    }

    [Command]
    public void CmdUpdateCell (int x, int y, LineDirection lineDirection)
    {
        RpcUpdateCell (x, y, lineDirection);
        gm.UpdateCell (x, y, lineDirection);
    }
}
ответил Sri Krishna Paritala 20 J0000006Europe/Moscow 2015, 20:09:58
0

Небольшое добавление к ответу Шри Кришны Париталы:

Я заметил, что [command] выполняется только локально , если он вызывается изнутри a MonoBehaviour.Update(). Чтобы выполнить его на сервере , потребовалось вызвать [command] из контекста его ---- +: = 3 = + ----. Другими словами, это было исправлено:

  1. Внутри функции NetworkBehaviour просто установите локальную переменную в MonoBehaviour.Update(), содержащий NetworkBehaviour.
  2. Выполните [command] изнутри [command] если установлена ​​переменная из 1.
ответил SePröbläm 24 SunEurope/Moscow2017-12-24T14:51:01+03:00Europe/Moscow12bEurope/MoscowSun, 24 Dec 2017 14:51:01 +0300 2017, 14:51:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132