2016-03-20 13 views
2

Unity 5'in Ağ HLAPI'sı ile oynuyorum. NetworkManager'u kullanmak istemiyorum çünkü Unity'nin Çok Oyunculu hizmetlerini (Matchmaker ve Relay sunucuları) ödemek istemiyorum.UNet: Sunucu nesnesini üretemedi (NetworkManager'I KULLANMAYIN)

İstemci Sunucuya bağlandığında İstemci'de bir Oynatıcıya çalışıyorum. Ben İstemci doğru sunucusuna bağlanmaya alabilirsiniz, ama yumurtlama aşağıdaki hata ile Client başarısız:

Failed to spawn server object, assetId=b861a662c70615a40971e7bab10e4e14 netId=1 
UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate() 

Not o Server üzerinde, oyuncu nesne doğru çoğaltılır.

Minimal repro:

Bir Birlik 2D projesinde olduğum ve benim ana kamera için aşağıdaki komut dosyası ekledim:

using UnityEngine; 
using UnityEngine.Networking; 
using UnityEngine.Networking.NetworkSystem; 

public class MenuMinimalRepro : MonoBehaviour 
{ 
    private NetworkClient networkClient; 

    void OnGUI() 
    { 
     if (this.networkClient != null && this.networkClient.isConnected) 
     { 
      GUI.Label(new Rect(100, 25, 150, 25), "Running as Client"); 
     } 
     else if (NetworkServer.active) 
     { 
      GUI.Label(new Rect(100, 25, 150, 25), "Running as Server"); 
     } 
     else 
     { 
      if (GUI.Button(new Rect(100, 25, 150, 25), "Start as Client")) 
      { 
       this.StartClient(); 
      } 
      if (GUI.Button(new Rect(100, 50, 150, 25), "Start as Server")) 
      { 
       this.StartServer(); 
      } 
     } 
    } 

    public void StartServer() 
    { 
     NetworkServer.Listen(54321); 
     NetworkServer.RegisterHandler(MsgType.AddPlayer, OnAddPlayerServer); 
    } 

    public void StartClient() 
    { 
     this.networkClient = new NetworkClient(); 
     this.networkClient.RegisterHandler(MsgType.Connect, OnConnectedClient); 
     this.networkClient.Connect("localhost", 54321); 
    } 

    // Connected handler for the client side 
    public void OnConnectedClient(NetworkMessage netMsg) 
    { 
     ClientScene.AddPlayer(this.networkClient.connection, 0); 
    } 

    // AddPlayer handler for the server side 
    public void OnAddPlayerServer(NetworkMessage netMsg) 
    { 
     AddPlayerMessage msg = netMsg.ReadMessage<AddPlayerMessage>(); 
     GameObject newPlayer = (GameObject)Instantiate(Resources.Load("Prefabs/Player")); 
     NetworkServer.AddPlayerForConnection(netMsg.conn, newPlayer, msg.playerControllerId); 
    } 
} 

My Oyuncu amacı, basit bir peri olduğunu ben NetworkIdentity bileşeniyle bir Prefabrik haline getirildi (see my Prefab in the Inspector). Player Prefabrik bir Kaynaklar klasöründedir, böylece kodu kolayca yükleyebilirim (see my Prefab in the Project View).

Oyunun bir arka plan örneğini (Ctrl + B kullanarak) başlatıyorum ve bunu Sunucu olarak başlatıyorum ve ardından Unity Editor'da Oynat düğmesini tıklatıp bu örneği İstemci olarak başlatıyorum. Birlik daha sonra bahsettiğim hatayı rapor eder.

Neyi yanlış yaptığımı bilen var mı?

cevap

1

ben çözdüm . Ne olur? Sunucu, müşteriye hangi Prefab'i bir karma vererek bildireceğini söyler (hata mesajında ​​görüldüğü gibi). Sorun şu ki, hash, Prefabrinizi UNet sistemine kaydettirene kadar Müşteriye hiçbir şey ifade etmiyor.

Yani, tek yapmam gereken, soruma örnekte ClientScene.AddPlayer(...) numaralı çağrıdan önce ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player")) numaralı telefonu aramak oldu.

Bu birinin işe yaramasını umarız!

+0

Spinging'i işlemek için birileri NetworkingManager'ı kullanıyorsa ve bir noktada aşağıdaki hataları alırsanız: - "Spawn sahne nesnesi, 1 UnityEngine.Networking.NetworkIdentity için bulunamadı: UNetStaticUpdate()" prefabrinizi yeniden oluşturmayı veya meta dosyaları silmeyi deneyin. –

2

Ayrıca istemcilerde yumurtlama oyuncular için OnClientConnect() olay uygulamak istiyorum:

public virtual void OnClientConnect(NetworkConnection conn) 
{ 
    ClientScene.Ready(conn); 
    ClientScene.AddPlayer(0); 
} 

bakın: Using the Network Manager (Client üzerine çağrılan İşlevleri)

+0

Cevabınız için teşekkürler, ancak bunu zaten OnConnectedClient() yöntemimde yapıyorum. 'Hazır()' otomatik olarak yapan farklı bir aşırı yük kullanıyorum. Sadece iki ayrı çağrıya değiştirmeyi denedim, ama yine de aynı hatayı alıyorum. – jenkins

+0

Bunu çözdüğüne sevindim, önereceğim bir sonraki şey buydu. :-) – peterept