Я могу создавать игры с приглашениями, я могу приглашать и принимать приглашения, в основном все работает отлично.Проблема возникает, когда я делаю игру для 3 или более человек:
- пользователь A создает игру с 3 или 2 людьми как минимум
- пользователь A выбирает пригласить кого-то, а затем добавляетдругой человек для автоматического выбора комнаты
- Пользователь A приглашает пользователя B
- Пользователь B принимает
- Они оба ждут, пока не появится кнопка «Начать сейчас»
- Пользователь B нажимает кнопку «начать сейчас», и OnRoomConnected () вызывается 3 раза по какой-то причине, и игра не запускается (насколько я могу судить, комната также никогда не покидалась, поскольку этот пользователь больше не может получать приглашения).)
- Ничего не меняется с точки зрения пользователя А, он все еще ждет запуска игры или поиска другого оппонента с автоматическим выбором
Я убедился, что проблема не в моейкод.Я создал отдельный простой проект, который я использовал только для целей тестирования, и он делает то же самое.Так что я начал думать, что, возможно, это не проблема с моей стороны, и я не видел подобных проблем в интернете.Поэтому я решил спросить здесь.Что я должен делать?В чем может быть проблема?
Вот и все.Даже если я ограничу количество игроков до 3 или 4 (минимальное и максимальное количество игроков равно 3 или 4), это все же позволяет мне начать игру преждевременно, и у меня та же проблема с вызовом OnRoomConnected () несколько раз иигра не запускается.
Заранее спасибо.Если у вас есть ссылка или что-то, что могло бы помочь мне решить эту проблему, это было бы очень полезно.
Вот основной код, который я использовал для входа в игру и создания комнаты.
public class GPGM : MonoBehaviour, RealTimeMultiplayerListener{
public static GPGM instance;
public static int target;
private void Awake()
{
target = 60;
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = target;
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = this;
}
else if (instance != this)
{
Destroy(gameObject);
}
}
// Use this for initialization
void Start () {
Login();
}
// Update is called once per frame
void Update () {
}
public void Login()
{
StartCoroutine(checkInternetConnection((isConnected) =>
{
LoginGPG();
}));
}
IEnumerator checkInternetConnection(Action<bool> action)
{
WWW www;
www = new WWW("http://google.com");
yield return www;
if (!String.IsNullOrEmpty(www.error))
{
Debug.Log("DebugM | no internet connection");
action(false);
}
else
{
Debug.Log("DebugM | There IS connection");
action(true);
}
}
public void LoginGPG()
{
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().WithInvitationDelegate(OnInvitationReceived).Build();
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = true;
PlayGamesPlatform.Activate();
Debug.Log("DebugM | LoginGPG");
Auth();
}
public void Auth()
{
Debug.Log("DebugM | Auth");
try
{
//doesn't work sometimes for some reason. It gives null data if success is false
//reason for false success is unknown
Social.localUser.Authenticate((bool succes) =>
{
if (succes)
{
Debug.Log("DebugM | Logged in");
}else
{
Debug.Log("DebugM | authentication failed");
}
});
}
catch (Exception e)
{
Debug.Log("DebugM | Auth() has failed with error: " + e.Message);
}
}
public void OnInvitationReceived(Invitation invitation, bool shouldAutoAccept)
{
StartCoroutine(InvitationCo(invitation, shouldAutoAccept));
}
Invitation mIncomingInvitation;
IEnumerator InvitationCo(Invitation invitation, bool shouldAutoAccept)
{
yield return new WaitUntil(() => SceneManager.GetActiveScene().name == "Lobby");
Debug.Log("DebugM | Invitation has been received!!!");
//StartCoroutine(LM.LoadingAnim());
if (shouldAutoAccept)
{
Debug.Log("DebugM | Should auto accept: TRUE");
PlayGamesPlatform.Instance.RealTime.AcceptInvitation(invitation.InvitationId, instance);
}
else
{
// The user has not yet indicated that they want to accept this invitation.
// We should *not* automatically accept it. Rather we store it and
// display an in-game popup:
Debug.Log("DebugM | Should auto accept: FALSE");
Lobby LM = FindObjectOfType<Lobby>();
LM.invPanel.SetActive(true);
mIncomingInvitation = invitation;
}
}
public void AcceptGoogleInv(GameObject panel)
{
if (mIncomingInvitation != null)
{
// show the popup
//string who = (mIncomingInvitation.Inviter != null &&
// mIncomingInvitation.Inviter.DisplayName != null) ?
// mIncomingInvitation.Inviter.DisplayName : "Someone";
Debug.Log("DebugM | Invitation has been accepted");
PlayGamesPlatform.Instance.RealTime.AcceptInvitation(mIncomingInvitation.InvitationId, instance);
panel.SetActive(false);
}
}
public void CreateQuickRoom()
{
PlayGamesPlatform.Instance.RealTime.CreateWithInvitationScreen(1, 3, 1, instance );
}
public void OnRoomSetupProgress(float percent)
{
Debug.Log("OnRoomSetupProgress()");
PlayGamesPlatform.Instance.RealTime.ShowWaitingRoomUI();
}
public void OnRoomConnected(bool success)
{
SceneManager.LoadScene("Game");
Debug.Log("DebugM | Room conected");
}
public void OnLeftRoom()
{
throw new NotImplementedException();
}
public void OnParticipantLeft(Participant participant)
{
throw new NotImplementedException();
}
public void OnPeersConnected(string[] participantIds)
{
throw new NotImplementedException();
}
public void OnPeersDisconnected(string[] participantIds)
{
throw new NotImplementedException();
}
public void OnRealTimeMessageReceived(bool isReliable, string senderId, byte[] data)
{
throw new NotImplementedException();
}}
Редактировать (изображения): Это когда я жду, когда заполнится последний слот автоматического выбора (работает так, только когда люди были приглашены в игру)
Theигра идет в лобби для человека, который нажал кнопку «Старт», а остальные все еще ждут последнего автопика, даже если 1 игрок практически вышел из комнаты