使用Unity的高级API进行集成

要使用Networking High-Level API集成Unity Multiplayer Services ,您必须直接在脚本中使用NetworkMatch类。要使用它,你必须NetworkMatch手动调用函数并自己处理回调。

以下是如何创建匹配项,列出匹配项以及仅使用NetworkMatchNetworkServerNetworkClient类加入匹配项的示例。

该脚本将媒人设置为指向公共Unity媒人服务器。它调用NetworkMatch创建,列出和连接匹配的函数:

    • CreateMatch创建一个匹配
    • JoinMatch加入比赛
    • ListMatch用于列出匹配器服务器上注册的匹配项

在内部,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()
        {
            // You would normally not join a match you created yourself but this is possible here for demonstration purposes.
            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!");
        }
    }

🔚