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

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

Вот часть моего кода client.

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++;

}

Вот часть моего кода server.

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: объект, который вы хотите создать, имеет значение null.

Я не понимаю, почему newPrefab.p имеет значение null... Любая идея для новичка в сетевом программировании?


person Dagoo Mong    schedule 03.05.2017    source источник


Ответы (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);.

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

person Programmer    schedule 04.05.2017
comment
Что делать, если я хочу отделить код сервера от кода клиента? где хранить этот префаб? в обе стороны (вроде бы не хорошо)? - person Alejandro Morán; 09.01.2018