寻找Unity Matchmaker(5.4)的基本解释以及如何在脚本

时间:2016-08-30 16:03:16

标签: c# unity3d unity5 matchmaking

由于价格决定通过Unity over Photon进行网络连接(如果有更好的网络方式让我知道)我一直在尝试创建一个简单的统一匹配器,当用户进入游戏时他们首先寻找任何其他比赛(AKA房间/游戏),如果有一个他们加入它,如果没有他们创建一个。然而,我正在努力找到如何使用统一匹配器的明确解释,所以我可以开发代码来获得我想要的行为,这似乎更棘手,因为看起来团结在最近的更新中改变了它的网络系统所以我相信任何事情之前5.4目前已过时。我发现的唯一有用的东西是this示例代码,但我想更多地了解系统,所以我不会错过任何关键概念,这可能是因为我相当初学者。

所以我今天要问你的是,你可以指导我对配对制度(包括脚本)的明确解释,这种制度与当前的统一有关,或者说,更难和更耗时,你能不能尝试这样做你自己,它将作为像我这样的其他人的未来参考。

感谢阅读,当然任何答案都将不胜感激。

[我在c#工作]

编辑:

我理解我的问题很难回答,因此我将测试示例代码,直到我得到所需的行为并发布任何我无法解决的错误。

问题1

  1. 我已将准确的代码(下面包含以便于参考)复制到我已连接到网络管理员的脚本中。但是由于保护级别而导致错误 -
  2. enter image description here

    我有两个关于如何解决这个问题的理论 -

    1. 更改方法访问者
    2. 不从monobehaviour派生剧本
    3. 我目前正在测试它们,任何有关如何解决这个问题的建议都非常有用。我想知道我是否应该向团结报告这对我而言,它似乎是统一文档中的一个错误的例子,它说它已经更新为5.4。感谢。

      问题2

      我已经创建了这个脚本,并在连接到带有单个网络管理器的空GameObject的编辑器中运行它,我没有编译器错误但是当我运行它时调试“错误:匹配搜索失败”这意味着列表匹配功能不成功,我的脚本在下面 -

      using UnityEngine;
      using UnityEngine.Networking;
      using UnityEngine.Networking.Match;
      using UnityEngine.Networking.Types;
      using System.Collections;
      using System.Collections.Generic;
      
      public class MyMatchMaker : MonoBehaviour {
          bool done;
          // Use this for initialization
          void Start () {
              NetworkManager.singleton.StartMatchMaker();
              NetworkManager.singleton.matchMaker.ListMatches(0, 20, "Match", false, 0, 1, OnMatchList);
              Debug.Log("Searching");
          }
      
          public virtual void OnMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> matchList)
          {
              if (success)
              {
                  if (matchList.Count != 0)
                  {
                      Debug.Log("Matches Found");
                      NetworkManager.singleton.matchMaker.JoinMatch(matchList[0].networkId, "", "", "", 0, 1, OnMatchJoined);
                  }
                  else
                  {
                      Debug.Log("No Matches Found");
                      Debug.Log("Creating Match");
                      NetworkManager.singleton.matchMaker.CreateMatch("Match", 2, true, "", "", "", 0, 1, OnMatchCreate);
                  }
              }
              else
              {
                  Debug.Log("ERROR : Match Search Failure");
              }
          }
      
          public virtual void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfo)
          {
              if (success)
              {
                  Debug.Log("Match Joined");
                  MatchInfo hostInfo = matchInfo;
                  NetworkManager.singleton.StartClient(hostInfo);
      
                  OnConnect();
              }
              else
              {
                  Debug.Log("ERROR : Match Join Failure");
              }
      
          }
      
          public virtual void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfo)
          {
              if (success)
              {
                  Debug.Log("Match Created");
      
                  MatchInfo hostInfo = matchInfo;
                  NetworkServer.Listen(hostInfo, 9000);
                  NetworkManager.singleton.StartHost(hostInfo);
      
                  OnConnect();
              }
              else
              {
                  Debug.Log("ERROR : Match Create Failure");
              }
          }
      
          void OnConnect ()
          {
              if (Network.isServer)
              {
                  Debug.Log("You are Server");
              }
              else if (Network.isClient)
              {
                  Debug.Log("You are Client");
              }
              else
              {
                  Debug.Log("ERROR : MatchMaking Failed, Peer type is neither Client nor Server");
              }
          }
      }
      

      谢谢,希望你能看到我哪里出错了。

      @Programmer

1 个答案:

答案 0 :(得分:1)

啊......让这段代码正常工作我在回调中调出了信息字符串,不得不改变一些项目设置。

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

public class MyMatchMaker : MonoBehaviour {
    bool done;
    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartMatchMaker();
        NetworkManager.singleton.matchMaker.ListMatches(0, 20, "Match", false, 0, 1, OnMatchList);
        Debug.Log("Searching");
    }

    public virtual void OnMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> matchList)
    {
        if (success)
        {
            if (matchList.Count != 0)
            {
                Debug.Log("Matches Found");
                NetworkManager.singleton.matchMaker.JoinMatch(matchList[0].networkId, "", "", "", 0, 1, OnMatchJoined);
            }
            else
            {
                Debug.Log("No Matches Found");
                Debug.Log("Creating Match");
                NetworkManager.singleton.matchMaker.CreateMatch("Match", 2, true, "", "", "", 0, 1, OnMatchCreate);
            }
        }
        else
        {
            Debug.Log("ERROR : Match Search Failure");
        }
    }

    public virtual void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfo)
    {
        if (success)
        {
            Debug.Log("Match Joined");
            MatchInfo hostInfo = matchInfo;
            NetworkManager.singleton.StartClient(hostInfo);

            OnConnect();
        }
        else
        {
            Debug.Log("ERROR : Match Join Failure");
        }

    }

    public virtual void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfo)
    {
        if (success)
        {
            Debug.Log("Match Created");

            MatchInfo hostInfo = matchInfo;
            NetworkServer.Listen(hostInfo, 9000);
            NetworkManager.singleton.StartHost(hostInfo);

            OnConnect();
        }
        else
        {
            Debug.Log("ERROR : Match Create Failure");
        }
    }
}