2016-11-17 8 views
0

Я делаю простую игру в ЛВС, чтобы просто подружиться в Unity Networking. Все, что он должен делать, - это когда игрок нажимает квадрат в сетке, он меняет его на синий. Моя проблема заключается в том, что LAN Host нажимает на квадрат, он обновляется только локально и не обновляет клиентов. Когда клиент нажимает на квадрат, он обновляется локально, и хост LAN обновляется, но другие клиенты не обновляются. Все мои сетки имеют прикрепленный к ним сетевой идентификаторПростая игра для Unity5 LAN, серверное обновление клиентов не

Любые идеи?

Heres код:

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

    public class Player_Paint : NetworkBehaviour { 

     [SyncVar]GameObject syncGridPiece; 
     GameObject gridPiece; 

     void Update() { 
      Paint(); 
      TransmitGridColours(); 
     } 

     void Paint(){ 
      if(isLocalPlayer && Input.GetMouseButtonDown(0)){ 
       RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); 
       if(hit.collider != null){ 
        print(GameObject.Find (hit.transform.name)); 
        gridPiece = hit.collider.transform.gameObject; 
        gridPiece.GetComponent<SpriteRenderer>().color = Color.blue; 
       } 
      } 
     } 
     [Command] 
     void CmdProvideGridColourToServer(GameObject gridPiece){ 
      if(gridPiece){ 
       syncGridPiece = gridPiece; 
       syncGridPiece.GetComponent<SpriteRenderer>().color = Color.blue; 
      } 

     } 
     [Client] 
     void TransmitGridColours(){ 
      if(isLocalPlayer){ 
       CmdProvideGridColourToServer(gridPiece); 
      } 
     } 
    } 
+0

"if (gridPiece) {"? Это GameObject ... BTW вам просто нужно обновить переменную синхронизации, все свойства/значения/и т. Д. Были перенесены на сервер с помощью «локального» игрока (т. Е. Измените цвет, затем нажмите вверх) –

+0

«if (gridPiece) {«было, когда игра начинается с того, что GO пуст. только заселяется, когда его щелкают. просто поставьте это там, чтобы остановить его от того, чтобы бросить мне ссылочные ошибки. Я не совсем понимаю, что вы имеете в виду. когда я делаю «syncGridPiece = gridPiece»; is not, что обновление переменной? – justinC19

+0

[Command] == Позволяет локальному проигрывателю отправлять данные на сервер (через [SyncVar] tagged member vars.). [Клиент ** Подключиться **] == Получать данные с помощью метода, помеченного префиксом [Command] –

ответ

2

Вы должны добавить крюк к вашему syncGridPiece syncvar. В функции hook установите цвет в синий цвет, как и в Command. Крючок будет называться удаленными игроками.

Также я не думаю, что вы можете использовать GameOject как syncvar. Вам просто нужно отправить идентификатор.

[SyncVar(hook=UpdateGridPiece)] int syncGridPiece 

Возможно, RPC будет более приспособлен к тому, что вы хотите сделать. Насколько я понимаю, syncGridPiece может быть любым квадратом, поэтому вы не должны передавать все обновления в одном сообщении. Просто отправьте, чтобы X игроков нажали X квадрат с RPC.

Посмотрите на пример повреждения: https://docs.unity3d.com/Manual/UNetActions.html

+0

Спасибо за это. Хотя я не полностью понимаю ClientRpc, это то, что мне нужно, чтобы заставить его работать. – justinC19

+0

Команда вызывает функцию от объекта локального игрока на сервер (тот же самый). ClientRPC вызывает функцию от игрока сервера до (того же) игрока на всех клиентах. – FLX

0

Фигурные его. Придется использовать ClientRpc. Код ниже.

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

public class Player_Paint : NetworkBehaviour { 
    GameObject gridPiece; 

    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 
     Paint(); 
    } 

    void Paint(){ 
     if(isLocalPlayer && Input.GetMouseButtonDown(0)){ 
      RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); 
      if(hit.collider != null){ 
       print(GameObject.Find (hit.transform.name)); 
       gridPiece = hit.collider.transform.gameObject; 
       print("SettingColor"); 
       CmdProvideGridColourToServer(gridPiece,Color.blue); 
      } 
     } 
    } 

    [Command] 
    void CmdProvideGridColourToServer(GameObject gridPiece,Color color){ 
     RpcTransmitGridColours(gridPiece,color); 

    } 
    [ClientRpc] 
    void RpcTransmitGridColours(GameObject gridPiece, Color color){ 
     gridPiece.GetComponent<SpriteRenderer>().color = color; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^