2017-05-03 75 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

如果我想將服務器代碼與客戶端代碼分開,該怎麼辦?應該在哪裏存儲預製件?在雙方(它似乎並不好)? –

相關問題