首页 文章

UNet:无法生成服务器对象(不使用NetworkManager)

提问于
浏览
3

我'm playing around with Unity 5'的网络HLAPI . I don't want to use the NetworkManager ,因为我没有't want to pay for Unity'的多人游戏服务(Matchmaker和Relay服务器) .

当客户端连接到服务器时,我正在尝试在客户端上生成播放器 . 我可以让客户端正确连接到服务器,但是客户端上的产生失败,并出现以下错误:

Failed to spawn server object, assetId=b861a662c70615a40971e7bab10e4e14 netId=1
UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()

请注意,在服务器上,播放器对象正确生成 .

Minimal repro:

我在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对象是一个简单的精灵,我已经使用NetworkIdentity组件(see my Prefab in the Inspector)制作了预制件 . 我的Player Prefab位于Resources文件夹中,因此我可以从代码(see my Prefab in the Project View)轻松加载它 .

我启动游戏的后台实例(使用Ctrl B)并将其作为服务器启动,然后单击Unity Editor中的“播放”按钮并将该实例作为客户端启动 . 然后Unity报告我之前提到的错误 .

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

2 回答

  • 2

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

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

    请参阅:Using the Network Manager(参见客户端上调用的函数)

  • 2

    我已经明白了 . 发生的事情是服务器通过给它一个哈希(如错误消息中所示)告诉客户端哪个Prefab实例化 . 问题是,在您使用UNet系统注册预制件之前,哈希对客户端没有任何意义 .

    所以,我需要做的就是在我的问题示例中调用 ClientScene.AddPlayer(...) 之前调用 ClientScene.RegisterPrefab(Resources.Load("Prefabs/Player")) .

    希望这有助于某人!

相关问题