Unity NetworkServer / NetworkClient传输GameObject

时间:2017-05-03 19:27:59

标签: c# unity3d network-programming spawn unity-networking

我正在开发NetworkServer / NetworkClient之间的统一网络。我没有使用NetworkManager

以下是我的客户代码的一部分。

public void StartPaintClient()
{
    client = new NetworkClient();
    client.Connect(host, port);
    client.RegisterHandler(NetworkMeta.PaintPrefabId, OnMouseButtonDown);
}
public void OnMouseButtonDown(NetworkMessage netMsg)
{
    var receivedPrefab = netMsg.ReadMessage<NetworkMeta.PaintPrefab>();
    GameObject prefab = Instantiate(receivedPrefab.p);
    prefab.name = "" + index++;

}

以下是我的服务器代码的一部分。

public GameObject prefab;
public void StartPaintServer()
{

    if (NetworkServer.active)
    {
        Debug.Log("Server is already acitve");
        return;
    }
    NetworkServer.Listen(port);
}
void Update()
{
     if(Input.GetMouseButtonUp(0))
     {
          prefab = Instantiate(Line_Prefab);
          var newPrefab = new NetworkMeta.PaintPrefab();
          newPrefab.p = prefab;
          NetworkServer.SendToAll(NetworkMeta.PaintPrefabId, newPrefab);
     }
}

我有两个问题。

  1. 即使没有控制台错误,我使用NetworkServer.SendToAll(msgType, msg)代替NetworkServer.Spawn(obj)的原因也完全无效。可能的原因是什么?
  2. 上面的代码也有问题。每当NetworkServer.SendToAll(mspType, msg)导致
  3. 时,colsole错误消息
      

    ArgumentException:要实例化的Object为null。

    我不明白为什么newPrefab.p为null .... 关于网络编程新手的任何想法?

1 个答案:

答案 0 :(得分:0)

我不使用Unet并且对此知之甚少,但在生成预制件之前必须执行以下操作。

1 。预制件必须附有NetworkIdentity脚本。

2 。您必须先注册预制件才能生成预制件。

Networking.ClientScene.RegisterPrefab(Line_Prefab);

然后您可以使用NetworkServer.Spawn

var line = (GameObject)Instantiate(Line_Prefab, pos, rot);
NetworkServer.Spawn(line);

请注意,我直接在预制件上使用NetworkServer.Spawn。我必须在使用(GameObject)Instantiate(Line_Prefab, pos, rot);生成的GameObject上使用它。

还要确保您已将编辑器中的预制件分配给变量。您可以了解有关在网络here上发布对象的更多信息。