Unity:Google Play游戏在登录时崩溃

时间:2017-04-13 12:40:25

标签: unity3d google-play-games

我正在尝试使用Google Play游戏云保存来保存变量。然而,它在登录时崩溃。我肯定在开发者控制台上启用它。在我添加云保存功能之前,我从未遇到过这个问题,它只是在做成就和记分板。此外,当我没有连接到互联网时,它不会崩溃,本地保存数据工作正常。任何人都可以帮忙吗?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GooglePlayGames;
using GooglePlayGames.BasicApi;
using GooglePlayGames.BasicApi.SavedGame;
using System.Text;

public class playgamesscript : MonoBehaviour {

public static playgamesscript Instance { get; private set; }


const string SAVE_NAME = "Test";

bool isSaving;
textEdit textEditScript;
control controlScript;

bool isCloudDataLoaded;

// Use this for initialization
void Start () {
    Instance = this;

    textEditScript = GameObject.FindGameObjectWithTag("UIControl").GetComponent<textEdit>();
    controlScript = GameObject.FindGameObjectWithTag("Control").GetComponent<control>();

    if (!PlayerPrefs.HasKey(SAVE_NAME))
        PlayerPrefs.SetString(SAVE_NAME, "0");
    if (!PlayerPrefs.HasKey("IsFirstTime"))
        PlayerPrefs.SetInt("IsFirstTime", 1);

    LoadLocal();


    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder().EnableSavedGames().Build();
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    if (control.signInAttempt == false)
    {
        SignIn();
    }
}

void SignIn()
{
    control.signInAttempt = true;
    Social.localUser.Authenticate(success => { LoadData();  });
}

#region Saved Games

string GameDataToString()
{
    return control.Highscore.ToString();
}

void StringToGameData(string cloudData, string localData)
{
    if (PlayerPrefs.GetInt("IsFirstTime") == 1){
        PlayerPrefs.SetInt("IsFirstTime", 0);
        if (int.Parse(cloudData) > int.Parse(localData)){
            PlayerPrefs.SetString(SAVE_NAME, cloudData);
        }
    }
    else if (int.Parse(localData) > int.Parse(cloudData))
    {
        control.Highscore = int.Parse(localData);
        AddScoreToLoeaderBoard(textEdit.leaderboardStat, control.Highscore);
        isCloudDataLoaded = true;
        SaveData();
        return;
    }
    control.Highscore = int.Parse(cloudData);
    isCloudDataLoaded = true;

}

void StringToGameData (string localData)
{
    control.Highscore = int.Parse(localData);
}

void LoadData()
{
    if (Social.localUser.authenticated)
    {
        isSaving = false;
        ((PlayGamesPlatform)Social.Active).SavedGame.OpenWithManualConflictResolution(SAVE_NAME, DataSource.ReadCacheOrNetwork, true, ResolveConflict, OnSavedGameOpened);
    }
    else {
        LoadLocal();
    }
}

private void LoadLocal()
{
    StringToGameData(PlayerPrefs.GetString(SAVE_NAME));
}

public void SaveData()
{
    if (!isCloudDataLoaded)
    {
        SaveLocal();
        return;
    }

    if (Social.localUser.authenticated)
    {
        isSaving = true;
        ((PlayGamesPlatform)Social.Active).SavedGame.OpenWithManualConflictResolution(SAVE_NAME, DataSource.ReadCacheOrNetwork, true, ResolveConflict, OnSavedGameOpened);
    }
    else
    {
        SaveLocal();
    }
}

private void SaveLocal()
{
    PlayerPrefs.SetString(SAVE_NAME, GameDataToString());
}

private void ResolveConflict(IConflictResolver resolver, ISavedGameMetadata original, byte[] originalData, ISavedGameMetadata unmerged, byte[] unmergedData)
{
    if (originalData == null)
    {
        resolver.ChooseMetadata(unmerged);
    } else if (unmergedData == null)
    {
        resolver.ChooseMetadata(original);
    } else
    {
        string originalStr = Encoding.ASCII.GetString(originalData);
        string unmergedStr = Encoding.ASCII.GetString(unmergedData);

        int originalNum = int.Parse(originalStr);
        int unmergedNum = int.Parse(unmergedStr);

        if (originalNum > unmergedNum)
        {
            resolver.ChooseMetadata(original);
            return;
        } else if (unmergedNum> originalNum)
        {
            resolver.ChooseMetadata(unmerged);
        }
        resolver.ChooseMetadata(original);
    }
}

private void OnSavedGameOpened(SavedGameRequestStatus status, ISavedGameMetadata game)
{
    if (status == SavedGameRequestStatus.Success)
    {
        if (!isSaving)
        {
            LoadGame(game);
        } else
        {
            SaveGame(game);
        }
    }
    else
    {
        if (!isSaving)
        {
            LoadLocal();
        }else
        {
            SaveLocal();
        }
    }
}

private void LoadGame(ISavedGameMetadata game)
{
    ((PlayGamesPlatform)Social.Active).SavedGame.ReadBinaryData(game, OnSavedGameDataRead);
}

private void SaveGame(ISavedGameMetadata game)
{
    string stringToSave = GameDataToString();
    PlayerPrefs.SetString(SAVE_NAME, stringToSave);

    byte[] dataToSave = Encoding.ASCII.GetBytes(stringToSave);

    SavedGameMetadataUpdate update = new SavedGameMetadataUpdate.Builder().Build();

    ((PlayGamesPlatform)Social.Active).SavedGame.CommitUpdate(game, update, dataToSave, OnSavedGameDataWritten);
}

private void OnSavedGameDataRead(SavedGameRequestStatus status, byte[] savedData)
{
    if (status == SavedGameRequestStatus.Success)
    {
        string cloudDataString;
        if (savedData.Length == 0)
        {
            cloudDataString = "0";
        } else

        cloudDataString = Encoding.ASCII.GetString(savedData);
        string localDataString = PlayerPrefs.GetString(SAVE_NAME);

        StringToGameData(cloudDataString, localDataString);
    }
}

private void OnSavedGameDataWritten(SavedGameRequestStatus status, ISavedGameMetadata game)
{

}

#endregion /Saved Games

///

JNI DETECTED ERROR IN APPLICATION: can't call void com.google.android.gms.common.api.PendingResult.setResultCallback(com.google.android.gms.common.api.ResultCallback) on null object'

0 个答案:

没有答案
相关问题