Version: 2020.3
言語: 日本語
HUD を使ったインテグレーション
NetworkTransport を使った統合

Unity の高レベル API を使った統合

高レベル API を使って Unity Multiplayer Services を統合するには、NetworkMatch クラスを直接スクリプトで使用する必要があります。それを使うには、手動で NetworkMatch で関数を呼び出し、コールバックを自分で処理しなければなりません。

以下は、NetworkMatchNetworkServerNetworkClient クラスを使ってどのようにマッチを作成 (create) し、一覧にし (list)、加わるか (join) の例です。

このスクリプトは、パブリックのマッチメーカーサーバーにアクセスするためのマッチメーカーを設定します。マッチを作成し (creating)、リストし (listing)、参加する (joining) ための NetworkMatch 関数を呼び出します。

  • CreateMatch - マッチを作成 (create)
  • JoinMatch - マッチに加わる (join)
  • ListMatches - マッチメーカーサーバーに登録したマッチをリストする (list)

内部的には、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!");
    }
}

Did you find this page useful? Please give it a rating:

  • HUD を使ったインテグレーション
    NetworkTransport を使った統合