Unity Mirror - 联网游戏对象未显示

时间:2021-05-21 06:32:52

标签: unity3d mirror

我正在使用 Unity Mirror 将我的应用程序联网,以便中央服务器(不是主机)可以向它所连接的客户端发送命令。 在播放时,“游戏”将使程序在播放时自动成为客户端或服务器,因此我不必使用 NetworkManagerHUD 提供的仅客户端/服务器按钮。

目前我面临两个问题:

  1. 客户端在与服务器建立连接后立即断开连接。当我覆盖 OnClientConnect 函数时,我放置了 base.OnClientConnect(conn) 行。进入原始函数后,我得出结论是 autoCreatePlayer 设置为 true 导致了这个问题。 (服务器和客户端是在同一台计算机上运行的程序的两个实例,因为我只能使用本地主机进行测试)。
public override void OnClientConnect(NetworkConnection conn)
    {

        base.OnClientConnect(conn);    //This line causes the error message 
        clientConnected = true;
        GameObject[] prefabs = Resources.LoadAll<GameObject>("NetworkingComponents");

        foreach (var prefab in prefabs)
        {
 
            NetworkClient.RegisterPrefab(prefab);

        }

        
        GameObject[] gos = Resources.LoadAll<GameObject>("NetworkingComponents");

    }

KCP received disconnect message

  1. 也许是最关键的问题。参考上一个问题,如果我确实删除了该行
    base.OnClientConnect(conn),客户端可以连接,但所有联网的游戏对象(带有 NetworkIdentity)在作为客户端连接时仍未显示,即使 NetworkManagerHUD 表示程序已作为客户端连接。 (奇怪的是,如果连接为服务器,它们就会显示出来。)

这是重写的 NetworkManager 代码的其余部分。

public class MyNetworkManager : NetworkManager
{

    public GameObject dropdown;
    public Canvas canvas;

    
    //---------------------------Networking stuff----------------------------------
    
    public List<NetworkNode> networkedNodes { get; } = new List<NetworkNode>();
    public List<Settings> networkedSettings { get; } = new List<Settings>();
    public List<NetworkedVisualisersDisplay> visualisersDisplays { get; } = new List<NetworkedVisualisersDisplay>();
    public List<Visualiser> visualisers{ get; } = new List<Visualiser>();
    public static MyNetworkManager instance = null;
    public NetworkedVisualisersDisplay visDisplayPrefab;
    public NetworkNode networkNode;
    private string homeName;
    public volatile bool clientConnected = false;

    public bool IsClientConnected()
    {
        return clientConnected;
    }
    //the purpose of having a delay is that we need to determine if the call to StartClient() actually started the player as a client. It could fail if it’s the first player instance on the network. 
    public IEnumerator DelayedStart()
    {
        //base.Start();
        StartClient();
        yield return new WaitForSeconds(2);
        print("conn count " + NetworkServer.connections.Count);

        if (!IsClientConnected())
        {
            NetworkClient.Disconnect();
         print(“starting as server”);
            StartServer();
            clientConnected = false;

        }
        else
        {
            print("starting as client");
        }
        
        visDisplayPrefab = Resources.Load<NetworkedVisualisersDisplay>("NetworkingComponents/NetworkedVisualisersDisplay");
        if (instance == null)
        {
            instance = this;
            print("instance = " + this);

        }
        else
        {
            print("manager destroyed");

            Destroy(gameObject);
        }
        yield return null;
    }


    //-----------------------------------------------------------------------------
    public override void Start(){

        StartCoroutine(DelayedStart());
  
    } 
    public override void OnStartServer()
    {
        
        GameObject[] prefabs = Resources.LoadAll<GameObject>("NetworkingComponents"); 
        foreach (var prefab in prefabs)
        {
            
            spawnPrefabs.Add(prefab);
                    
        }
        
    }
    
   
    public override void OnServerChangeScene(string scenename)
    {

        if (scenename.Equals("Visualisers"))
        {

            for (int i = 0; i < visualisersDisplays.Count; i++)
            {
                var conn = networkedNodes[i].connectionToClient;

                NetworkedVisualisersDisplay visSceneInstance = Instantiate(visualisersDisplays[i]);
                NetworkServer.Destroy(conn.identity.gameObject);
                NetworkServer.ReplacePlayerForConnection(conn, visSceneInstance.gameObject);
            }



        }
        else if (Settings.Instance.sceneNames.Contains(scenename))
        {
            for (int i = 0; i < visualisersDisplays.Count; i++)
            {
                var conn = visualisers[i].connectionToClient;
                var visInstance = Instantiate(visualisers[i]);
                NetworkServer.Destroy(conn.identity.gameObject);
                NetworkServer.ReplacePlayerForConnection(conn, visInstance.gameObject);
                
            }
        }
        

    }
    public override void OnServerAddPlayer(NetworkConnection conn)
    {       
        NetworkNode n = Instantiate(networkNode);
        NetworkServer.AddPlayerForConnection(conn, n.gameObject);
        NetworkNode.instance.DisplayMessage();
    }

   
    public override void OnClientConnect(NetworkConnection conn)
    {

        base.OnClientConnect(conn);
    //we are connected as a client
        clientConnected = true;
        GameObject[] prefabs = Resources.LoadAll<GameObject>("NetworkingComponents");

        foreach (var prefab in prefabs)
        {
            NetworkClient.RegisterPrefab(prefab);

        }
        
    }

}

任何帮助将不胜感激!

0 个答案:

没有答案
相关问题