Unity NetworkServer / NetworkClient, передающий GameObject

Я работаю над созданием единой сети между NetworkServer/NetworkClient. Я не использую NetworkManager

Вот часть моего кода клиента.

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 имеет значение null.... Есть идея для новичка в сетевом программировании?

1 ответ

Я не использую Unet и не знаю много об этом, но вы должны сделать следующее, прежде чем создавать префаб.

1. Сборный должен иметь NetworkIdentity Сценарий прилагается к нему.

2. Вы должны зарегистрировать префаб, прежде чем сможете его создать.

Networking.ClientScene.RegisterPrefab(Line_Prefab);

тогда вы можете использовать NetworkServer.Spawn,

var line = (GameObject)Instantiate(Line_Prefab, pos, rot);
NetworkServer.Spawn(line);

Обратите внимание, что я не использую NetworkServer.Spawn прямо на сборный. Я должен был использовать его на GameObject, порожденном (GameObject)Instantiate(Line_Prefab, pos, rot);,

Также убедитесь, что вы присвоили префаб из редактора вашей переменной. Вы можете узнать больше о порождении Объектов в сети здесь.

Другие вопросы по тегам