Unity + PlayFab c# последовательное исполнение - PullRequest
0 голосов
/ 13 апреля 2020

Пожалуйста, сообщите о синтаксисе C#, я делаю Rest API Call в PlayFab, чтобы получить профиль игрока и затем назначить отображаемое имя игрока локальной переменной c publi, НО во время выполнения последовательности функции, которую я нашел что они совсем не последовательны. Я не понимаю, почему, как и в python или java, все функции являются последовательными, и они будут выполняться после завершения другой функции.

По логам c он должен выполнить функцию запуска с помощью OnLoginWithGoogleAccountPlayFab , который вызовет GetPlayerProfile , извлекает имя игрока и присваивает публичные c строки PlayerDisplayName , затем вызывает ChangeSceneOnNewPlayer, который проверит имя, если оно есть значение NULL.

Но это выполняется так введите описание изображения здесь

public PlayerDisplayName;
void Start(){
        OnLoginWithGoogleAccountPlayFab();
}
public void OnLoginWithGoogleAccountPlayFab() {
        PlayFabClientAPI.LoginWithGoogleAccount(new LoginWithGoogleAccountRequest()
        {
            TitleId = PlayFabSettings.TitleId,
            ServerAuthCode = AuthCode,
            CreateAccount = true
        }, (result) =>
        {
            PlayFabId = result.PlayFabId;
            SessionTicket = result.SessionTicket;
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- --------------------- GET PROFILE 1");
            GetPlayerProfile();
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------NAME 1 ");
            ChangeSceneOnNewPlayer();
        }, OnPlayFabError);
    }

public void GetPlayerProfile() {
        PlayFabClientAPI.GetPlayerProfile(new GetPlayerProfileRequest()
        {
            PlayFabId = PlayFabId,
            ProfileConstraints = new PlayerProfileViewConstraints()
            {
                ShowDisplayName = true,
            }
        }, (result) =>
        {
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------PROFILE 2");
            Debug.Log("The player's DisplayName profile data is: " + result.PlayerProfile.DisplayName);
            PlayerDisplayName = result.PlayerProfile.DisplayName;
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------PROFILE 3");
        }, OnPlayFabError);
    }

public void ChangeSceneOnNewPlayer() {
        Debug.Log("Player Info");
        Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------NAME 2 ");
        if (PlayerDisplayName == null) {
            Debug.Log("Player Info is NULL " + PlayerDisplayName);
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------NAME 3 ");
            SceneManager.LoadSceneAsync("New_Player", LoadSceneMode.Single);
        } else {
            Debug.Log("Player Info NOT null " + PlayerDisplayName);
            Debug.LogWarning("waaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrr- ---------------------NAME 3 ");
            SceneManager.LoadSceneAsync("City", LoadSceneMode.Single);
        }
    }

1 Ответ

0 голосов
/ 13 апреля 2020

Ваши методы выполняются последовательно, но возвращаемые вами результаты возвращаются асинхронно. Это вводит условия гонки в ваш код и является причиной того, что вы видите способ ChangeSceneOnNewPlayer, выполняемый до того, как вы получили профиль игрока.

Давайте разберем, что происходит в следующих строках (отладка удалена для ясности):

// Both these lines execute synchronously.
PlayFabId = result.PlayFabId;
SessionTicket = result.SessionTicket;

// Here you're invoking a synchronous method, but inside the method
// an asynchronous call is made to PlayFab, and the result will not be immediately
// returned.
GetPlayerProfile();

// Then you immediately call this method, but you haven't waited for the result from 
// PlayFab before you make this call.
ChangeSceneOnNewPlayer();

То, что вы хотите, выглядит примерно так:

public PlayerDisplayName;

void Start()
{
    OnLoginWithGoogleAccountPlayFab();
}

public void OnLoginWithGoogleAccountPlayFab()
{
    PlayFabClientAPI.LoginWithGoogleAccount(new LoginWithGoogleAccountRequest()
    {
        TitleId = PlayFabSettings.TitleId,
        ServerAuthCode = AuthCode,
        CreateAccount = true
    }, (result) =>
    {
        PlayFabId = result.PlayFabId;
        SessionTicket = result.SessionTicket;

        // Get the profile, and specify a callback for when the result is returned
        // from PlayFab.
        GetPlayerProfile(OnGetPlayerProfile);
    }, OnPlayFabError);
}

public void GetPlayerProfile(Action<PlayerDisplayName> onGetPlayerDisplayName)
{
    PlayFabClientAPI.GetPlayerProfile(new GetPlayerProfileRequest()
    {
        PlayFabId = PlayFabId,
        ProfileConstraints = new PlayerProfileViewConstraints()
        {
            ShowDisplayName = true,
        }
    }, onGetPlayerDisplayName, OnPlayFabError);
}

// This method is used as a callback to your GetPlayerProfile function and is used
// to process the information.
public void OnGetPlayerProfile(PlayerDisplayName playerDisplayName)
{
    PlayerDisplayName = playerDisplayName;
    if (PlayerDisplayName == null)
    {
        SceneManager.LoadSceneAsync("New_Player", LoadSceneMode.Single);
    }
    else
    {
        SceneManager.LoadSceneAsync("City", LoadSceneMode.Single);
    }
}

Это стандартный шаблон при использовании любых вызовов API RESTful.

...