justinC19
justinC19

Reputation: 41

Simple Unity5 LAN game, server updating clients are not

I am making a simple LAN game to just get my bearings in Unity Networking. All it is supposed to do is when a player clicks on a square in a grid, it changes it blue. My issue is when the LAN Host clicks on a square, it only updates locally and doesn't update the clients. When the client clicks on a square, it updates locally and the LAN host gets updated, but other clients do not get updated. All of my grid pieces have a network identity attached to them

Any ideas?

Heres the code:

     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);
             }
         }
     }

Upvotes: 0

Views: 571

Answers (2)

justinC19
justinC19

Reputation: 41

Figured it out. Had to use ClientRpc. Code below.

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;
    }
}

Upvotes: 0

FLX
FLX

Reputation: 2679

You need to add a hook to your syncGridPiece syncvar. In the hook function set the color to blue, like you did in the Command. The hook will be called on remote players.

Also I don't think you can use a GameOject as a syncvar. You just need to send it's ID.

[SyncVar(hook=UpdateGridPiece)] int syncGridPiece

Maybe an RPC would be more adapted to what you want to do. From what I understand syncGridPiece could be any square so you shouldn't pass all updates in the same message. Just send that X players clicked X square with an RPC.

Look at the damage example : https://docs.unity3d.com/Manual/UNetActions.html

Upvotes: 2

Related Questions