2016-03-20 4 views
2

Я играю с Unity 5 в сети HLAPI. Я не хочу использовать NetworkManager, потому что я не хочу платить за многопользовательские сервисы Unity (серверы Matchmaker и Relay).UNet: Не удалось создать серверный объект (не используя NetworkManager)

Я пытаюсь создать Игрока на Клиенте, когда Клиент подключается к Серверу. Я могу получить клиент правильно подключиться к серверу, но нерест терпит неудачу на клиенте со следующей ошибкой:

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

Обратите внимание, что на сервере, объект игрока правильно нерестится.

Минимальная репродукция:

Я в проекте Unity 2D, и я прикрепил следующий сценарий к моей главной камере:

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

Моего объект игрок является простым спрайтом, что я 'сделана в Prefab с компонентом NetworkIdentity (see my Prefab in the Inspector). Мой Player Prefab находится в папке «Ресурсы», поэтому я могу легко загрузить его из кода (see my Prefab in the Project View).

Я запускаю фоновый экземпляр игры (используя Ctrl + B), и я запускаю его как сервер, а затем я нажимаю кнопку «Воспроизвести» в редакторе Unity и запускаю этот экземпляр в качестве клиента. Затем Unity сообщает об ошибке, о которой я упоминал ранее.

Кто-нибудь знает, что я могу делать неправильно?

ответ

1

Я понял это , Что происходит, так это то, что Сервер сообщает клиенту, что Prefab создает экземпляр, предоставляя ему хэш (как видно из сообщения об ошибке). Проблема в том, что хэш ничего не значит для Клиента, пока вы не зарегистрировали свой Prefab в системе UNet.

Итак, все, что мне нужно было сделать, это позвонить ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player")) перед вызовом ClientScene.AddPlayer(...) в примере в моем вопросе.

Надеюсь, это поможет кому-то!

+0

Если кто-то использует NetworkingManager для обработки spwaning и в какой-то момент получить ошибку ниже: - «Объект сцены Spawn не найден для 1 UnityEngine.Networking.NetworkIdentity: UNetStaticUpdate()« попытайтесь перестроить ваш сбор или удалить метафайлы. –

2

Вы хотите также реализовать OnClientConnect() событие для нерестовых игроков на клиентов:

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

Приведи: Using the Network Manager (см функции вызываются на клиенте)

+0

Спасибо за ответ, но я уже делаю это в своем методе 'OnConnectedClient()'. Я использую другую перегрузку, которая автоматически запускает 'Ready()'. Я попытался изменить его на 2 отдельных вызова на всякий случай, но я все равно получаю ту же ошибку. – jenkins

+0

Рад, что вы поняли это, это было следующее, что я бы предложил. :-) – peterept

Смежные вопросы