Лучший способ сохранить большое количество данных локально в Unity3D Android?

1

Я работаю над 2D-игрой, которая позже будет использоваться в качестве рекламной активности на стойле, мне нужно хранить информацию о пользователе, имя, номер, электронную почту и оценку. Там данные могут превышать тысячи записей. Каким будет лучший и свободный способ реализовать его в единстве5? Игра будет развернута на Android.

  • 0
    Я бы начал с базы данных SQL ...
  • 0
    Можете ли вы уточнить, как? @ ŁukaszMotyczka
Показать ещё 2 комментария
Теги:
database
unity3d

3 ответа

3
Лучший ответ

ПРИМЕЧАНИЕ. По какой-либо причине не используйте "StreamWriter".

Просто используйте тривиальные команды File.Write.

Это очень распространенное недоразумение в Unity!

В Unity существует огромная проблема, когда люди видят совершенно неправильный пример кода в сети, а смешные проблемы распространяются годами. Никогда, никогда не используйте "StreamWriter" - просто используйте тривиальные функции File.Write. Не может быть проще.


Относительно вопроса выше: "тысячи" записей абсолютно ничего. (Любой нерелевантный значок маленькой иконки в вашем приложении полностью затмевает размер ваших данных имени/адреса.)

(1) вы можете просто сохранить текстовый файл (ы),

Это невероятно легко писать и читать файлы в Unity.

// IO crib sheet..
// filePath = Application.persistentDataPath+"/"+fileName;
// check if file exists System.IO.File.Exists(f)
// write to file File.WriteAllText(f,t)
// delete the file if needed File.Delete(f)
// read from a file File.ReadAllText(f)

что все, что с ним связано.

   string currentText = File.ReadAllText(filePath);

ПРИМЕЧАНИЕ WELL...........

// filePath = Application.persistentDataPath+"/"+fileName;
// YOU MUST USE "Application.persistentDataPath"
// YOU CANNOT USE ANYTHING ELSE
// NOTHING OTHER THAN "Application.persistentDataPath" WORKS
// ALL OTHER OPTIONS FAIL ON ALL PLATFORMS
// YOU CAN >ONLY< USE Application.persistentDataPath IN UNITY

Вы можете сохранить информацию в любом из форматов форматов, таких как JSON или csv. Поскольку у вас есть крошечный объем информации, вы можете просто сохранить Json как список и легко получить доступ к нему.

Обратите внимание, что если вы не знакомы с такими основными задачами программирования, как использование JSON или csv (все это очень просто), вам нужно будет это изучить. SO вопросы/ответы не могут быть учебниками.

(2) вы можете узнать об использовании локальной базы данных SQL, которую стоит изучить. Сделайте то, что говорит Лукаш Мотызка в комментариях.

(3) верно, что ваша задача настолько мала, что вы можете просто использовать PlayerPrefs. обратите внимание, однако это на самом деле самый сложный путь! Это был бы настоящий беспорядок, пытаясь использовать PlayerPrefs в качестве простой базы данных. Так что не делайте этого.

(4) Обратите внимание, что на практике в наши дни нет "локальных приложений". "Разработчик приложений" должен быть облачным разработчиком, вероятно, вам нужно будет использовать Firebase или подобное (Parse неожиданно закрыт в этом году!)

1

Для всех, кто приходит сюда, потому что они пытаются получить доступ к Application.StreamingDataPath(или что-то еще в APK, если на то пошло), вы не можете просто использовать File api, как описано в ответе Fattie. Вам необходимо использовать веб-запрос, поскольку APK по существу является сжатой папкой, а System.IO не может получить доступ к внутренним компонентам этих пакетов.

Вам нужно будет использовать UnityWebRequest для получения данных из нужного места в PKG. Вы можете включать сырые файлы в свою игру, добавляя папку в любом месте проекта и вызывая ее StreamingAssets (папки ресурсов реконструируются внутри APK и не могут быть напрямую доступны, они также загружаются в память во время выполнения, что заставляет игру начинаться очень медленно), затем укажите ваш UWR на Application.streamingDataPath и получите данные из request.downloadHandler.data.

Для сохранения новых данных вам необходимо использовать Application.persistantDataPath, после чего с помощью System.IO.File будет отлично.

Вот пример захвата данных из APK!/assets/folder (где android помещает папку StreamingAssets), а затем сохраняет его в место для последующего использования.

public IEnumerator GetSomeDataAndThenSave(string path)
{
    UnityWebRequest request = UnityWebRequest.Get(path);

    request.Send();

    while(!request.isDone)
    {
        yield return null;
    }

    if (!request.isNetworkError && (request.responseCode == 0 || request.responseCode == (long)System.Net.HttpStatusCode.OK))
    {
        WrapperClass yourClassList = new WrapperClass();
        YourClassList.members = JsonUtility.FromJson<YourClass>(request.downloadHandler.text);

        var bytes = System.Text.Encoding.UTF8.GetBytes(JsonUtility.ToJson(instance));
        File.WriteAllBytes(Application.persistentDataPath + "/SubDirectory/" + Path.GetFileName(path), bytes);
    }

    request.Dispose();
}

Надеюсь, что это очистит все, кто имеет ту же проблему.

  • 0
    Привет Симус - ОП по этому вопросу (очень просто) хочет просто написать, а затем прочитать некоторые данные. (К вашему сведению, в комментариях было много дискуссий об этом, теперь нет!) Это просто строка кода, как указано в моем ответе. Почти каждая игра делает это - это ничего, совершенно тривиально. Пример Seamus, приведенный здесь, объясняет, как загрузить «пакеты, которые вы отправляете вместе с установкой приложения» (я уверен, что это очень полезно для некоторых читателей).
1

Вы используете PlayerPrefs(Key,Value) для сохранения данных в единстве. это один из простых способов хранения данных в Unity.

  • 0
    ты не читал вопрос?
  • 0
    на самом деле объем обсуждаемых данных настолько мал, что использовать PlayerPrefs
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню