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);
}
}
У меня два вопроса.
- Причина, почему я использую
NetworkServer.SendToAll(msgType, msg)
вместоNetworkServer.Spawn(obj)
не работает вообще, даже если не было ошибки консоли. Каковы возможные причины этого? - Коды выше также имеет проблемы. Сообщение об ошибке 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);
,
Также убедитесь, что вы присвоили префаб из редактора вашей переменной. Вы можете узнать больше о порождении Объектов в сети здесь.