Как использовать общий SharedPreference между Unity и Android?

208
24 августа 2017, 19:22

Моя основная задача заключается в том чтобы, научить Unity читать значения из SharedPreference, я пробовал следовать этой инструкции, но ничего не работает, возможно я что то не понял. Подскажите, что не так?!

Сначала я сделал плагин из этого кода:

package com.yourcompany.productname.activity;
    import android.app.Activity;
    import android.content.SharedPreferences;
    public class lib extends Activity {
        public static final String PREFS_NAME = "MyPrefsFile";
        public void setPreferenceString (String prefKey, String prefValue) {
            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            SharedPreferences.Editor editor = settings.edit();
            editor.putString(prefKey, prefValue);
            editor.commit();
        }
        public String getPreferenceString (String prefKey) {
            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
            String playerName = settings.getString(prefKey, "");
            return playerName;
        }
    }

Поместил плагин и манифест в Assets/Plugins/Android/libs, затем создал такой скрипт:

using UnityEngine;
using System.Collections;
public class Plugin : MonoBehaviour {
    void Start () {
        SetPreferenceString("playerName", "John Doe");
    }
    void Update () {
        TextMesh textMesh = GetComponent<TextMesh> ();
        var plugin = new AndroidJavaClass ("com.yourcompany.productname.activity.lib");
        textMesh.text = plugin.CallStatic<string> ("getPreferenceString", "playerName");
    }
    AndroidJavaObject AJO = null;
    public void SetPreferenceString (string prefKey, string prefValue) {
        if(AJO == null)
            AJO = new AndroidJavaObject("com.yourcompany.productname.activity.lib", new object[0]);
        AJO.Call("setPreferenceString", new object[] { prefKey, prefValue } );
    }
    public string GetPreferenceString (string prefKey) {
        if(AJO == null)
            AJO = new AndroidJavaObject("com.yourcompany.productname.activity.lib", new object[0]);
        if(AJO == null)
            return string.Empty;
        return AJO.Call<string>("getPreferenceString", new object[] { prefKey } );
    }
}

Как я понял должно работать так, вызывается метод SetPreferenceString обращаться к плагину и записывать значение, затем точно так же это значение выводится.

Answer 1

Вызываешь callstatic(а функция у тебя не статическая), замени на call

textMesh.text = plugin.CallStatic<string> ("getPreferenceString", "playerName");
Answer 2

в Unity необходимо использовать встроенный класс PlayerPrefs. Из его описания:

On Android data is stored (persisted) on the device. The data is saved in SharedPreferences. C#/JavaScript, Android Java and Native code can all access the PlayerPrefs data. The PlayerPrefs data is physically stored in /data/data/pkg-name/shared_prefs/pkg-name.xml.

Код для Unity:

PlayerPrefs.SetString("PlayerName", "Foobar"); // запись
PlayerPrefs.GetString("PlayerName"); // чтение

Код для Java:

SharedPreferences settings = context.getSharedPreferences(BuildConfig.APPLICATION_ID, MODE_PRIVATE);
String playerName = settings.getString("PlayerName", ""); // чтение
// запись
SharedPreferences.Editor editor = settings.edit();
editor.putString("PlayerName", "Foobar");
editor.apply();
READ ALSO
Создание новой строки с помощью java

Создание новой строки с помощью java

Имеются две таблицы Departments и EmployeesПри выборе строки в Departments происходит переход по employeesID в таблицу Employees

226
Адаптивность и макет

Адаптивность и макет

ЗдравствуйтеПоявился вопрос по поводу макета

257
Что делать дальше, цель - пойти front-end junior-ом в компанию? [требует правки]

Что делать дальше, цель - пойти front-end junior-ом в компанию? [требует правки]

Заранее прошу прощения за банальность вопроса, но мнение опытных людей со стэка для меня очень важно

226