Unity ゲーム プロジェクト用の単純なマルチプレイヤーを開発します。私は HLAPI から始めましたが、スポーン状態と同期状態が非常に遅いように見えるので、 https ://docs.unity3d.com/Manual/ の基本的な例から始めて、代わりに Unity インターネット サービスを調査することにしました。 UNetInternetServicesOverview.html . ここでの問題は古いリファレンスにあるため、問題の原因が私の誤解なのかバグのあるフレームワークなのかはわかりません.(
とにかく、最初の例を取り上げて、それを修正し始めたところ、サーバーの「接続」と「クライアント」の対応がわかりません。
すなわち、
- メソッドで一致を作成します
networkMatch.CreateMatch
。 - 次に、
OnMatchCreate
コールバックで値を確認しますNetworkServer.connections.Count
-0です。 - 次に、コールバックで作成された一致を呼び出し
networkMatch.ListMatches
て確認します。これは 1 です。matchInfoSnapshot.currentSize
- 同じコールバックをチェックイン
NetworkServer.connections.Count
しましたが、まだ 0 です (!!!)。私はチェックNetworkServer.localConnections.Count
します-それも0です。
OK、ローカル クライアントがサーバーへの接続を作成していないと推測しました (???)。確認してみましょう。
- 次に、同じクライアントから呼び出し
networkMatch.JoinMatch
ます-成功します。 - 次に
networkMatch.ListMatches
、もう一度呼び出しmatchInfoSnapshot.currentSize
て、コールバックで一致を確認します。現在は 2 です。 - 私は同じコールバックをチェックイン
NetworkServer.connections.Count
します - そしてそれは今も 2 です (!!!) (ながらNetworkServer.localConnections.Count
0 のままです)。
ですから、質問は簡単です - 私は愚かなカウンター変数を追加したくないのですが... サーバーに接続されているクライアントの実際の数を取得するにはどうすればよいですか?
PS: テストする簡略化されたスクリプト:
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);
}
}