我正在开发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)
的原因也完全无效。可能的原因是什么?NetworkServer.SendToAll(mspType, msg)
导致ArgumentException:要实例化的Object为null。
我不明白为什么newPrefab.p为null .... 关于网络编程新手的任何想法?
答案 0 :(得分:0)
我不使用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)Instantiate(Line_Prefab, pos, rot);
生成的GameObject上使用它。
还要确保您已将编辑器中的预制件分配给变量。您可以了解有关在网络here上发布对象的更多信息。