Unity3d UNet:未能生成服务器对象(未使用NetworkManager)

Unity3d UNet:未能生成服务器对象(未使用NetworkManager),unity3d,multiplayer,unity-networking,Unity3d,Multiplayer,Unity Networking,我正在玩Unity 5的网络HLAPI我不想使用NetworkManager,因为我不想为Unity的多人游戏服务(媒人和中继服务器)付费 当客户端连接到服务器时,我试图在客户端上生成一个播放器。我可以让客户端正确连接到服务器,但在客户端上生成失败,出现以下错误: Failed to spawn server object, assetId=b861a662c70615a40971e7bab10e4e14 netId=1 UnityEngine.Networking.NetworkIdentit

我正在玩Unity 5的网络HLAPI我不想使用NetworkManager,因为我不想为Unity的多人游戏服务(媒人和中继服务器)付费

当客户端连接到服务器时,我试图在客户端上生成一个播放器。我可以让客户端正确连接到服务器,但在客户端上生成失败,出现以下错误:

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);
    }
}
使用UnityEngine;
使用UnityEngine。联网;
使用UnityEngine.Networking.NetworkSystem;
公共类MenuMinimalRepro:单一行为
{
专用网络客户端;
void OnGUI()
{
if(this.networkClient!=null&&this.networkClient.isConnected)
{
标签(新的Rect(100,25,150,25),“作为客户机运行”);
}
else if(NetworkServer.active)
{
标签(新的Rect(100,25,150,25),“作为服务器运行”);
}
其他的
{
if(GUI.按钮(新的Rect(100,25,150,25),“作为客户机启动”))
{
this.StartClient();
}
if(GUI.按钮(新的Rect(100、50、150、25),“作为服务器启动”))
{
this.StartServer();
}
}
}
public void StartServer()
{
NetworkServer.Listen(54321);
NetworkServer.RegisterHandler(MsgType.AddPlayer,OnAddPlayerServer);
}
public void StartClient()
{
this.networkClient=新的networkClient();
this.networkClient.RegisterHandler(MsgType.Connect,OnConnectedClient);
这个.networkClient.Connect(“localhost”,54321);
}
//客户端的已连接处理程序
已连接客户端上的公共无效(NetworkMessage netMsg)
{
ClientScene.AddPlayer(this.networkClient.connection,0);
}
//服务器端的AddPlayer处理程序
ADDPlayerServer上的公共无效(NetworkMessage netMsg)
{
AddPlayerMessage msg=netMsg.ReadMessage)。我的播放器预置位于资源文件夹中,因此我可以从代码()轻松加载它

我启动一个游戏的后台实例(使用Ctrl+B)并将其作为服务器启动,然后单击Unity Editor中的Play按钮并将该实例作为客户端启动。Unity然后报告我前面提到的错误


有人知道我可能做错了什么吗?

您还想实现OnClientConnect()事件,以便在客户端上生成玩家:

public virtual void OnClientConnect(NetworkConnection conn)
{
    ClientScene.Ready(conn);
    ClientScene.AddPlayer(0);
}

参考:(参见在客户端调用的函数)

我已经弄明白了。发生的事情是,服务器通过给客户端一个散列(如错误消息中所示)来告诉客户端要实例化哪个预置。问题是,在您向UNet系统注册预置之前,散列对客户端没有任何意义

因此,我所需要做的就是在我问题中的示例中调用
ClientScene.AddPlayer(…)
之前调用
ClientScene.RegisterPrefab(Resources.Load(“prefacts/Player”)


希望这对某人有所帮助!

感谢您的回复,但我已经在我的
OnConnectedClient()
方法中这样做了。我使用了另一个重载来执行
Ready()
自动。为了以防万一,我尝试将其更改为两个单独的调用,但仍然会出现相同的错误。很高兴您能解决此问题,这是我建议的下一个问题:-)如果有人使用NetworkingManager处理间谍活动,并且在某个时候出现以下错误:-“未找到1 UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()”的生成场景对象。请尝试重建预设或删除元文件。