0

我正在研究 NetworkServer/NetworkClient 之间的统一网络。我不使用网络管理器

这是我的客户代码的一部分。

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)每当导致colsole 错误消息

ArgumentException:您要实例化的对象为空。

我不明白为什么 newPrefab.p 为空......对于网络编程新手有什么想法吗?

4

1 回答 1

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 上使用它(GameObject)Instantiate(Line_Prefab, pos, rot);

还要确保您将预制件从编辑器分配给您的变量。您可以在此处了解有关在网络上生成对象的更多信息。

于 2017-05-04T01:19:09.517 回答