【问题标题】:Simple Unity5 LAN game, server updating clients are not简单的Unity5局域网游戏,不更新服务器客户端
【发布时间】:2017-11-15 04:09:30
【问题描述】:

我正在制作一个简单的 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);
             }
         }
     }

【问题讨论】:

  • "if(gridPiece) {" ?这是一个游戏对象...顺便说一句,您只需更新同步变量,所有属性/值/等都由“本地”玩家推送到服务器(即更改颜色,然后向上推 GO)
  • "if(gridPiece) {" 是游戏开始时 GO 为空。仅在单击时才会填充。只是把它放在那里以阻止它向我抛出参考错误。我不完全明白你的意思。当我执行“syncGridPiece = gridPiece;”时这不是更新变量吗?
  • [Command] == 使用本地播放器调用它以向服务器提交数据(通过 [SyncVar] 标记的成员变量。)。 [ClientConnect] == 通过标有 [Command] 前缀的方法接收数据
  • 抱歉,我还是没跟上。可以给我一个代码示例吗?

标签: unity3d unity5 unity-networking


【解决方案1】:

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

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

[SyncVar(hook=UpdateGridPiece)] int syncGridPiece

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

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

【讨论】:

  • 谢谢。虽然我不完全了解 ClientRpc,但这实际上是我让它工作所需要的。
  • 命令调用从本地播放器对象到服务器(相同)播放器对象的函数。 ClientRPC 在所有客户端上调用从服务器播放器到(相同)播放器的函数。
【解决方案2】:

想通了。不得不使用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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多