2016-03-20 21 views
2

Ich spiele mit der Networking HLAPI von Unity 5 herum. Ich möchte den NetworkManager nicht verwenden, da ich nicht für Unity Multiplayer-Dienste (Matchmaker- und Relay-Server) bezahlen möchte.UNet: Fehler beim Erstellen des Serverobjekts (NIEMALS mit NetworkManager)

Ich versuche, einen Player auf dem Client zu spawnen, wenn der Client eine Verbindung zum Server herstellt. Ich kann den Kunden bekommen, richtig mit dem Server zu verbinden, aber der Laich nicht auf dem Client mit dem folgenden Fehler:

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

Beachten Sie, dass auf dem Server, laicht das Spielerobjekt richtig.

Minimal Repro:

Ich bin in einem Projekt Unity 2D und ich habe das folgende Skript zu meiner Hauptkamera angehängt:

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); 
    } 
} 

Mein Player-Objekt ist ein einfaches Sprit, das ich habe mit der NetworkIdentity Komponente (see my Prefab in the Inspector) zu einem Prefab gemacht. Mein Player-Prefab befindet sich in einem Ressourcen-Ordner, sodass ich es problemlos aus dem Code (see my Prefab in the Project View) laden kann.

Ich starte eine Hintergrundinstanz des Spiels (mit Strg + B) und ich starte es als Server, und dann klicke ich im Unity Editor auf die Schaltfläche Wiedergabe und starte diese Instanz als Client. Unity meldet dann den Fehler, den ich zuvor erwähnt habe.

Weiß jemand, was ich falsch machen könnte?

Antwort

1

Ich habe es herausgefunden . Was passiert, ist, dass der Server dem Client mitteilt, welches Prefab instanziiert werden soll, indem er ihm einen Hash gibt (wie in der Fehlermeldung zu sehen ist). Das Problem ist, dass Hash nichts für den Client bedeutet, bis Sie Ihr Prefab beim UNet-System registriert haben.

Also, alles, was ich tun musste, war ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player")) kurz vor dem Anruf an ClientScene.AddPlayer(...) im Beispiel in meiner Frage zu tun.

Hoffe das hilft jemandem!

+0

Wenn jemand NetworkingManager verwendet, um spwaning zu behandeln und irgendwann Fehler darunter: - "Spawn Szene Objekt nicht gefunden für 1 UnityEngine.Networking.NetworkIdentity: UNetStaticUpdate()" versuchen, Ihre Prefab oder Meta-Dateien zu löschen. –

2

Sie wollen auch die OnClientConnect() Ereignis für Laich Spieler auf Kunden implementieren:

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

Siehe: Using the Network Manager (siehe Funktionen auf dem Client aufgerufen)

+0

Danke für die Antwort, aber ich mache das schon in meiner 'OnConnectedClient()' Methode. Ich verwende eine andere Überladung, die das 'Ready()' automatisch ausführt. Ich habe versucht, es in zwei separate Anrufe für den Fall zu ändern, aber ich bekomme immer noch den gleichen Fehler. – jenkins

+0

Froh, dass Sie es herausgefunden haben, das war das nächste, was ich vorgeschlagen hätte. :-) – peterept