Unity Google Play Games Создать игру с проблемой приглашения - PullRequest
0 голосов
/ 14 сентября 2018

Я могу создавать игры с приглашениями, я могу приглашать и принимать приглашения, в основном все работает отлично.Проблема возникает, когда я делаю игру для 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 игрок практически вышел из комнаты

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете сделать это как:

public void OnRoomConnected (bool success)
   {
     if (success)
      {
        //Start the game here
        SceneManager.LoadScene("Game");
        Debug.Log("DebugM | Room conected");
      }
     else
      {
        //Do somthing else.
      }
   }

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

public void OnPeersConnected (string[] participantIds)
    {
      List<Participant> playerscount = PlayGamesPlatform.Instance.RealTime.GetConnectedParticipants();
      if (playerscount != null && playerscount.Count > 1)//this condition should be decided by you.
        {
          //Start the game here
          SceneManager.LoadScene("Game");
        }
    }
...