Ищите базовое объяснение единства matchmaker (5.4) и как использовать в скриптах
Решив создать сеть через Unity через Photon из-за цены (если есть лучший способ создания сетей, дайте мне знать), я пытался создать простого сваха, где, когда пользователь входит в игру, он сначала ищет любой другой матч (AKA комнаты / игры), если есть кто-то, к которому они присоединяются, если нет такого, который они создают. Однако я изо всех сил пытаюсь найти четкое объяснение того, как использовать средство поиска единства, поэтому я могу разработать код, чтобы получить желаемое поведение, которое кажется еще более хитрым, так как кажется, что в недавних обновлениях единство сильно меняет свою сетевую систему, поэтому я верю всему раньше 5.4 в настоящее время устарела. Единственная полезная вещь, которую я нашел, - это пример кода, но я хочу лучше понять систему, чтобы не пропустить ни одной ключевой концепции, которая, скорее всего, потому что я довольно новичок.
Итак, сегодня я спрашиваю вас: можете ли вы дать мне четкое объяснение системы организации матчей (включая сценарии), которая имеет отношение к текущему единству или, по общему признанию, гораздо сложнее и требует больше времени, вы можете попробовать сделать это самостоятельно, и это будет служить будущей ссылкой для других, как я.
Спасибо за чтение, конечно, любые ответы будут с благодарностью.
[Я работаю в C#]
РЕДАКТИРОВАТЬ:
Я понимаю, что на мой вопрос очень сложно ответить, поэтому я собираюсь протестировать пример кода, пока не получу желаемое поведение и не опубликую ошибки, которые не могу устранить.
Проблема 1
- Я скопировал точный код (включен ниже для более легкой ссылки) в скрипт, который я прикрепил к своему сетевому менеджеру. Но я получаю ошибки из-за уровней защиты -
У меня есть две теории о том, как решить эту проблему -
- Изменение метода доступа
- Не выводит сценарий из монобихи поведения
В настоящее время я проверяю их, любой совет о том, как решить эту проблему, был бы очень полезен. Интересно, должен ли я сообщить об этом в 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");
}
}
}