0

我正在制作一个简单的 LAN 游戏,以便了解 Unity Networking。它应该做的就是当玩家点击网格中的一个正方形时,它会将其变为蓝色。我的问题是当局域网主机点击一个方块时,它只在本地更新,不更新客户端。当客户端点击一个方块时,它会在本地更新,LAN 主机会更新,但其他客户端不会更新。我所有的网格块都附加了一个网络标识

有任何想法吗?

继承人的代码:

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

2 回答 2

2

您需要为您的 syncGridPiece 同步变量添加一个挂钩。在钩子函数中将颜色设置为蓝色,就像您在命令中所做的那样。该钩子将在远程播放器上调用。

另外,我认为您不能将 GameOject 用作​​同步变量。你只需要发送它的ID。

[SyncVar(hook=UpdateGridPiece)] int syncGridPiece

也许 RPC 会更适合您想要做的事情。据我了解,syncGridPiece 可以是任何正方形,因此您不应在同一条消息中传递所有更新。只需通过 RPC 发送 X 玩家点击 X 方块。

查看损坏示例:https ://docs.unity3d.com/Manual/UNetActions.html

于 2016-11-17T16:50:15.910 回答
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;
    }
}
于 2016-11-17T17:22:32.323 回答