2016-09-20 64 views
1

我将为我的Unity游戏项目开发一个简单的多人游戏。我从HLAPI开始,但在产卵和同步状态方面似乎很慢,所以我决定调查Unity Internet服务,从https://docs.unity3d.com/Manual/UNetInternetServicesOverview.html的基本示例开始。 这里的问题是过时的引用,所以我不知道如果我的麻烦的原因是我的误解或越野车框架(如何获得Unity中NetworkServer的实际连接数

无论如何,我拿第一个例子,开始修改它,并不能理解“连接”和“客户”为服务器之间的对应关系

也就是说,

  • 我创建networkMatch.CreateMatch方法的匹配
  • 然后在OnMatchCreate回调我检查NetworkServer.connections.Count价值 - 。这是0 。
  • 然后我打电话networkMatch.ListMatches看到创建匹配的matchInfoSnapshot.currentSize回调 - 这是1
  • 我在同一个回调检查NetworkServer.connections.Count - 它仍然是0(!)。我检查NetworkServer.localConnections.Count - 它也是0。

好吧,我推测本地客户端不会产生任何连接到服务器(???),让我们来检查它。

  • 然后我从同一客户端拨打networkMatch.JoinMatch - 它成功了。
  • 然后我再次拨打networkMatch.ListMatches并在回调中看到我的比赛的matchInfoSnapshot.currentSize - 现在是2。
  • 我在同一个回调中检查NetworkServer.connections.Count - 现在也是2(!!!)(而NetworkServer.localConnections.Count保持为0)。

所以,问题很简单 - 我希望不要添加任何愚蠢的计数器变量,但是...... 我怎样才能连接的客户端的实际数量的服务器上

P.S:简化的脚本测试:

using UnityEngine; 
    using UnityEngine.Events; 
    using UnityEngine.Networking; 
    using UnityEngine.Networking.Types; 
    using UnityEngine.Networking.Match; 
    using System.Collections.Generic; 

    public class TestNetworkController : MonoBehaviour 
    { 
     private NetworkMatch networkMatch; 

     void Start() { 
      networkMatch = gameObject.AddComponent<NetworkMatch>(); 

      networkMatch.CreateMatch ("TestMatch", 4, true, "", "", "", 0, 1, OnMatchCreate); 
     } 

     private void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfoResponse) { 
      NetworkServer.RegisterHandler (MsgType.Connect, OnServerConnect); 

      if (!NetworkServer.Listen (matchInfoResponse, 9000)) { 
       success = false; 
      } 

      if (success) { 
       Debug.Log ("Match created, connections="+NetworkServer.connections.Count+" localConnections="+NetworkServer.localConnections.Count); 

       networkMatch.ListMatches(0, 20, "", true, 0, 1, OnMatchesListPage1); 
      } 
     } 

     private void OnMatchesListPage1(bool success, string extendedInfo, List<MatchInfoSnapshot> matchListResponse) { 
      Debug.Log ("Match list received, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count); 
      Debug.Log ("Match 0 size "+matchListResponse[0].currentSize); 

      networkMatch.JoinMatch (matchListResponse[0].networkId, "", "", "", 0, 1, OnMatchJoined); 
     } 

     private void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfoResponse) { 
      if (success) { 
       NetworkClient networkClient = new NetworkClient(); 

       networkClient.RegisterHandler (MsgType.Connect, OnClientConnect); 
       networkClient.Connect (matchInfoResponse); 

       Debug.Log ("Match 0 joined, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count); 
      } 
     } 

     private void OnServerConnect(NetworkMessage networkMessage) { 
      Debug.Log("Client connected, connections="+NetworkServer.connections.Count); 

      networkMatch.ListMatches(0, 20, "", true, 0, 1, OnMatchesListPage2); 
     } 

     private void OnClientConnect(NetworkMessage networkMessage) { 
      Debug.Log("Connected to server, connections="+NetworkServer.connections.Count); 
     } 

     private void OnMatchesListPage2(bool success, string extendedInfo, List<MatchInfoSnapshot> matchListResponse) { 
      Debug.Log ("Match list received, connections=" + NetworkServer.connections.Count + " localConnections=" + NetworkServer.localConnections.Count); 
      Debug.Log ("Match 0 size "+matchListResponse[0].currentSize); 
     } 
    } 

而且它的控制台输出: Console output

+0

你确定你没有两次调用'JoinMatch'吗?找出问题的唯一方法是如果您在您的问题中编辑并发布您正在使用的代码来执行此测试。 – Programmer

+0

@Programmer,绝对确定。我已经添加了一个简单的脚本,所以你可以检查。 –

回答

0

您可以使用NetworkServer.numPlayers

然而,NetworkServer仅用于服务器端。如果你需要你的客户知道有多少其他客户,你必须同步一个变量。

如果您是客户端,请使用NetworkClient.allClients获取与服务器的连接。