高レベル API を使って Unity Multiplayer Services を統合するには、NetworkMatch クラスを直接スクリプトで使用する必要があります。それを使うには、手動で NetworkMatch
で関数を呼び出し、コールバックを自分で処理しなければなりません。
以下は、NetworkMatch、 NetworkServer、 NetworkClient クラスを使ってどのようにマッチを作成 (create) し、一覧にし (list)、加わるか (join) の例です。
このスクリプトは、パブリックのマッチメーカーサーバーにアクセスするためのマッチメーカーを設定します。マッチを作成し (creating)、リストし (listing)、参加する (joining) ための NetworkMatch
関数を呼び出します。
内部的には、NetworkMatch
は web サービスを使いマッチを構築し、処理が終了したときにコールバック関数が呼び出されます。例えば、マッチが作成されたときに OnMatchCreate
が呼び出されます。
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.Match;
using System.Collections.Generic;
public class HostGame : MonoBehaviour
{
List<MatchInfoSnapshot> matchList = new List<MatchInfoSnapshot>();
bool matchCreated;
NetworkMatch networkMatch;
void Awake()
{
networkMatch = gameObject.AddComponent<NetworkMatch>();
}
void OnGUI()
{
// 自身で作成したマッチには通常は参加しませんが、デモ目的のため、ここでは可能です。
if (GUILayout.Button("Create Room"))
{
string matchName = "room";
uint matchSize = 4;
bool matchAdvertise = true;
string matchPassword = "";
networkMatch.CreateMatch(matchName, matchSize, matchAdvertise, matchPassword, "", "", 0, 0, OnMatchCreate);
}
if (GUILayout.Button("List rooms"))
{
networkMatch.ListMatches(0, 20, "", true, 0, 0, OnMatchList);
}
if (matchList.Count > 0)
{
GUILayout.Label("Current rooms");
}
foreach (var match in matchList)
{
if (GUILayout.Button(match.name))
{
networkMatch.JoinMatch(match.networkId, "", "", "", 0, 0, OnMatchJoined);
}
}
}
public void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfo)
{
if (success)
{
Debug.Log("Create match succeeded");
matchCreated = true;
NetworkServer.Listen(matchInfo, 9000);
Utility.SetAccessTokenForNetwork(matchInfo.networkId, matchInfo.accessToken);
}
else
{
Debug.LogError("Create match failed: " + extendedInfo);
}
}
public void OnMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> matches)
{
if (success && matches != null && matches.Count > 0)
{
networkMatch.JoinMatch(matches[0].networkId, "", "", "", 0, 0, OnMatchJoined);
}
else if (!success)
{
Debug.LogError("List match failed: " + extendedInfo);
}
}
public void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfo)
{
if (success)
{
Debug.Log("Join match succeeded");
if (matchCreated)
{
Debug.LogWarning("Match already set up, aborting...");
return;
}
Utility.SetAccessTokenForNetwork(matchInfo.networkId, matchInfo.accessToken);
NetworkClient myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.Connect(matchInfo);
}
else
{
Debug.LogError("Join match failed " + extendedInfo);
}
}
public void OnConnected(NetworkMessage msg)
{
Debug.Log("Connected!");
}
}