2017-05-03 95 views
0

我正在研究NetworkServer/NetworkClient之间的统一网络。我不使用NetworkManagerUnity NetworkServer/NetworkClient传输GameObject

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

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. 上面的代码也有问题。该colsole错误味精每当NetworkServer.SendToAll(mspType, msg)导致

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

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

回答

0

我不使用Unet并且不太了解它,但是在产卵预制之前您必须执行以下操作。

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

。您必须先注册预制件,然后才能产卵。

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上了解更多关于spawn对象的知识。

+0

如果我想将服务器代码与客户端代码分开,该怎么办?应该在哪里存储预制件?在双方(它似乎并不好)? –

相关问题