Ищите базовое объяснение единства matchmaker (5.4) и как использовать в скриптах

Решив создать сеть через Unity через Photon из-за цены (если есть лучший способ создания сетей, дайте мне знать), я пытался создать простого сваха, где, когда пользователь входит в игру, он сначала ищет любой другой матч (AKA комнаты / игры), если есть кто-то, к которому они присоединяются, если нет такого, который они создают. Однако я изо всех сил пытаюсь найти четкое объяснение того, как использовать средство поиска единства, поэтому я могу разработать код, чтобы получить желаемое поведение, которое кажется еще более хитрым, так как кажется, что в недавних обновлениях единство сильно меняет свою сетевую систему, поэтому я верю всему раньше 5.4 в настоящее время устарела. Единственная полезная вещь, которую я нашел, - это пример кода, но я хочу лучше понять систему, чтобы не пропустить ни одной ключевой концепции, которая, скорее всего, потому что я довольно новичок.

Итак, сегодня я спрашиваю вас: можете ли вы дать мне четкое объяснение системы организации матчей (включая сценарии), которая имеет отношение к текущему единству или, по общему признанию, гораздо сложнее и требует больше времени, вы можете попробовать сделать это самостоятельно, и это будет служить будущей ссылкой для других, как я.

Спасибо за чтение, конечно, любые ответы будут с благодарностью.

[Я работаю в C#]

РЕДАКТИРОВАТЬ:

Я понимаю, что на мой вопрос очень сложно ответить, поэтому я собираюсь протестировать пример кода, пока не получу желаемое поведение и не опубликую ошибки, которые не могу устранить.

Проблема 1

  1. Я скопировал точный код (включен ниже для более легкой ссылки) в скрипт, который я прикрепил к своему сетевому менеджеру. Но я получаю ошибки из-за уровней защиты -

У меня есть две теории о том, как решить эту проблему -

  1. Изменение метода доступа
  2. Не выводит сценарий из монобихи поведения

В настоящее время я проверяю их, любой совет о том, как решить эту проблему, был бы очень полезен. Интересно, должен ли я сообщить об этом в Unity, поскольку мне кажется, что это неверный пример в документах Unity, которые говорят, что он обновлен до версии 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");
        }
    }
}

Спасибо, надеюсь, вы сможете увидеть, где я ошибся.

@Программист

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");
        }
    }
}
Другие вопросы по тегам