Я работаю над 2D-игрой, которая позже будет использоваться в качестве рекламной активности на стойле, мне нужно хранить информацию о пользователе, имя, номер, электронную почту и оценку. Там данные могут превышать тысячи записей. Каким будет лучший и свободный способ реализовать его в единстве5? Игра будет развернута на Android.
В 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 неожиданно закрыт в этом году!)
Для всех, кто приходит сюда, потому что они пытаются получить доступ к 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();
}
Надеюсь, что это очистит все, кто имеет ту же проблему.
Вы используете PlayerPrefs(Key,Value)
для сохранения данных в единстве. это один из простых способов хранения данных в Unity.
PlayerPrefs