UNet:无法生成服务器对象(不使用 NetworkManager)
UNet: Failed to spawn server object (NOT using NetworkManager)
我正在研究 Unity 5 的 Networking HLAPI。 我不想使用 NetworkManager,因为我不想为 Unity 的多人游戏服务(Matchmaker 和中继服务器)付费。
我试图在客户端连接到服务器时在客户端上生成播放器。我可以让客户端正确连接到服务器,但在客户端上生成失败并出现以下错误:
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);
}
}
我的 Player 对象是一个简单的 sprite,我使用 NetworkIdentity 组件 (see my Prefab in the Inspector). My Player Prefab is in a Resources folder so that I can load it easily from code (see my Prefab in the Project View) 将其制作成预制件。
我启动游戏的后台实例(使用 Ctrl+B)并将其作为服务器启动,然后单击 Unity 编辑器中的播放按钮并将该实例作为客户端启动。然后Unity报我之前提到的错误。
有谁知道我可能做错了什么?
您还想为在客户端生成玩家实现 OnClientConnect() 事件:
public virtual void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
ClientScene.AddPlayer(0);
}
参考:Using the Network Manager(参见在客户端调用的函数)
我已经弄明白了。发生的事情是,服务器通过给它一个散列(如错误消息中所示)告诉客户端要实例化哪个预制件。问题是,在您向 UNet 系统注册您的预制件之前,该哈希值对客户端没有任何意义。
所以,我需要做的就是在我的问题示例中调用 ClientScene.AddPlayer(...)
之前调用 ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player"))
。
希望这对某人有所帮助!
我正在研究 Unity 5 的 Networking HLAPI。 我不想使用 NetworkManager,因为我不想为 Unity 的多人游戏服务(Matchmaker 和中继服务器)付费。
我试图在客户端连接到服务器时在客户端上生成播放器。我可以让客户端正确连接到服务器,但在客户端上生成失败并出现以下错误:
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);
}
}
我的 Player 对象是一个简单的 sprite,我使用 NetworkIdentity 组件 (see my Prefab in the Inspector). My Player Prefab is in a Resources folder so that I can load it easily from code (see my Prefab in the Project View) 将其制作成预制件。
我启动游戏的后台实例(使用 Ctrl+B)并将其作为服务器启动,然后单击 Unity 编辑器中的播放按钮并将该实例作为客户端启动。然后Unity报我之前提到的错误。
有谁知道我可能做错了什么?
您还想为在客户端生成玩家实现 OnClientConnect() 事件:
public virtual void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
ClientScene.AddPlayer(0);
}
参考:Using the Network Manager(参见在客户端调用的函数)
我已经弄明白了。发生的事情是,服务器通过给它一个散列(如错误消息中所示)告诉客户端要实例化哪个预制件。问题是,在您向 UNet 系统注册您的预制件之前,该哈希值对客户端没有任何意义。
所以,我需要做的就是在我的问题示例中调用 ClientScene.AddPlayer(...)
之前调用 ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player"))
。
希望这对某人有所帮助!