PlayerPrefs на android не сохраняет.

Программирование для iPhone & Android

Re: PlayerPrefs на android не сохраняет.

Сообщение at0mGaming 25 ноя 2021, 11:19

samana писал(а):Попробовал как-то привести ваш код в более приемлемый вид (для моего восприятия).
Написал комментарии ( //-> ) там где поменял логику и прочее.
Ваш метод отрисовки createHightScoreEntryTransform не трогал (вроде), так как я не знаю что там происходит.

Попробуйте понять следующий код и как-то внедрить его в свой проект, либо оставить таким, если он подойдёт.
Любой дополнительный рефакторинг в ваших руках.

Уважаемый гуру, сейчас всё стабильно работает, как в редакторе Unity, так и при в билде. Единственным недостатком является то, что создаётся только одна запись, и она перезаписывается, сейчас пытаюсь понять почему. Я настолько уже ни в чём не уверен из-за этой ошибки, что хочется чтобы меня увезли в психдиспансер...
Судя по дебагам, такое ощущение, что при вызове AddScore создаётся новая чистая таблица и записывается результат туда...
Синтаксис:
Используется csharp
Debug перед ScoresList.Add()
{"ScoresList":[{"Score":300,"Name":"ощзо"}]}
UnityEngine.Debug:Log (object)
highScoreTable/ScoreTable:AddScore (int,string) (at Assets/highScoreTable.cs:114)

и Debug после _scoreTable.AddScore();
Синтаксис:
Используется csharp
{"ScoresList":[{"Score":300,"Name":"дзхъ"}]}
UnityEngine.Debug:Log (object)
highScoreTable:AddHightScoreAndSave (int,string) (at Assets/highScoreTable.cs:44)


Наверное надо было сразу написать: окно для записи имени игрока появляется после смерти игрока. После сохранения результата происходит или перезапуск сцены, или можно в главное меню уйти.
Запись в таблицу вызывается в другом скрипте следующем образом:
Синтаксис:
Используется csharp
FindObjectOfType<highScoreTable>().AddHightScoreAndSave(score, text);

Изображение
Изображение
at0mGaming
UNец
 
Сообщения: 15
Зарегистрирован: 23 ноя 2021, 22:18

Re: PlayerPrefs на android не сохраняет.

Сообщение samana 25 ноя 2021, 20:56

at0mGaming писал(а):такое ощущение, что при вызове AddScore создаётся новая чистая таблица и записывается результат туда...

Скорее всего так и есть. Точнее у вас был следующий метод, который я не разбирал
Синтаксис:
Используется csharp
private void createHightScoreEntryTransform(int score, string name, Transform container, List<Transform> transformList)
{
    float templateHight = 45f;
    Transform entryTransform = Instantiate(entryTemplate, container);
    RectTransform entryRectTransform = entryTransform.GetComponent<RectTransform>();
    entryRectTransform.anchoredPosition = new Vector2(0, -templateHight * transformList.Count);
    entryTransform.gameObject.SetActive(true);

    int rank = transformList.Count + 1;
    string rankString;
    switch (rank)
    {
        default:
            rankString = rank + ""; break;
        case 1:
            rankString = rank + "ый"; break;
        case 2:
            rankString = rank + "ой"; break;
        case 3:
            rankString = rank + "ий"; break;
    }
    entryTransform.Find("position (1)").GetComponent<Text>().text = rankString;
    entryTransform.Find("score (1)").GetComponent<Text>().text = score.ToString();
    entryTransform.Find("name (1)").GetComponent<Text>().text = name;

    transformList.Add(entryTransform);
}


В этом методе (выше) видно, что он отвечает за создание визуальной части таблицы для каждого отдельного рекорда в строке.
Поэтому если вы вызываете этот метод каждый раз при сохранении нового рекорда, то конечно снова и снова создаются новые элементы и вообще всё путается.
По хорошему вам нужно единожды создать визуальную часть таблицы на 10 строк и просто обновлять данные в них о рекордах. Или даже вручную создать такую таблицу и манипулировать её содержимым.

Но так как я сейчас не знаю ваш текущий код, то даже не знаю что и подсказать ещё.
Аватара пользователя
samana
Адепт
 
Сообщения: 4656
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск
  • Сайт

Re: PlayerPrefs на android не сохраняет.

Сообщение at0mGaming 25 ноя 2021, 22:33

samana писал(а):Но так как я сейчас не знаю ваш текущий код, то даже не знаю что и подсказать ещё.

Изначально я хотел доработать свой код, используя ваш, дабы понять в чём ошибка, потому что уже спать не даёт этот вопрос (это пожалуй главная цель, осознать проблему и как делать не нужно). Но мои изменения метода AddHightScoreEntry или проверки на пустоту, и попытки создать новую таблицу путём new HightScore() не привели к каким либо результатам, поэтому я решил использовать более понятный и легкочитаемый предложенный вами вариант. Попытался решить проблему перезаписи, но у меня тоже ничего не получилось, только смог отследить в какой момент теряются данные.
samana писал(а):Поэтому если вы вызываете этот метод каждый раз при сохранении нового рекорда, то конечно снова и снова создаются новые элементы и вообще всё путается.

Ну скорее он вызывается при перезапуске уровня в методе Awake()
samana писал(а):По хорошему вам нужно единожды создать визуальную часть таблицы на 10 строк и просто обновлять данные в них о рекордах. Или даже вручную создать такую таблицу и манипулировать её содержимым.

Можно создать вручную в инспекторе, или если таблица пустая, то через код генерировать 10 позиций с данными (0, ""), а потом перезаписывать их значения, а учитывая что сортировка уже реализована то они просто будут взаимозаменяться (так вы предлагаете?). Забыл упомянуть, что если вызвать AddHightScoreAndSave(x, "y") в Awake() несколько раз (ну как при записи тестового значения), то позиций в таблице будет несколько, но при обновлении сцены снова почему-то одна. На бумаге всё красиво, но на деле без наставлений профессионалов как видите я не обошёлся. Кроме того, идея с автоматической генерацией таблицы намного более интересная, чем работа в инспекторе.
Синтаксис:
Используется csharp
            ScoresList.Add(new ScoreData(score, name));
 
at0mGaming
UNец
 
Сообщения: 15
Зарегистрирован: 23 ноя 2021, 22:18

Re: PlayerPrefs на android не сохраняет.

Сообщение at0mGaming 29 ноя 2021, 20:26

samana писал(а):
at0mGaming писал(а):такое ощущение, что при вызове AddScore создаётся новая чистая таблица и записывается результат туда...

Скорее всего так и есть. Точнее у вас был следующий метод, который я не разбирал

Я разобрался! Как я глуп и недалёк был, о боже! (ещё больше поражает, что никто не смог объяснить мне почему я глуп =)) ).
Я не мог понять, почему когда мы записываем данные в Awake - они записываются
Синтаксис:
Используется csharp
 public void Awake()
    {
        entryContainer = transform.Find("highScoreEntryContainer");

        entryTemplate = entryContainer.Find("highScoreEntryTemplate");
        entryTemplate.gameObject.SetActive(false);

        hightScoreEntryTransformList = new List<Transform>();


        LoadTableOrDefault(); //-> загрузили таблицу, либо создали пустую, если сохранений не было

        //-> если таблица пустая, то добавляем тестовый сейв
        if (_scoreTable.IsEmpty)
            AddHightScoreAndSave(score: 1, name: "test");
            //AddHightScoreAndSave(score: 2, name: "test");
            //AddHightScoreAndSave(score: 3, name: "test");
        //-> обновляем UI таблицы
        RedrawTableUI();
    }

а когда вызываем из другого скрипта с помощью ... - они затираются
Синтаксис:
Используется csharp
FindObjectOfType<highScoreTable>().AddHightScoreAndSave(Collect.score, inputField2.text);
 

Ответ как-то сам пришёл, когда я "игрался" с записью AddHightScoreAndSave в Update, и ещё и был подтверждён железной логикой: если посмотреть на метод Awake(), то там мы сначала подружаем данные, а потом записываем, и при вызове нескольких AddHightScoreAndSave ничего не затирается...
Таким образов в при вызове из другого скрипта надо было также сначала подгружать данные:
Синтаксис:
Используется csharp
        FindObjectOfType<highScoreTable>().LoadTableOrDefault();
        FindObjectOfType<highScoreTable>().AddHightScoreAndSave(Collect.score, inputField2.text);

Если кому-то это покажется банальным и Очевидным, то скажу что вы могли поправить меня ещё в ответе, где я прилагал скриншоты, ведь там я вставлял код без подгрузки данных :)
А господину samana выражаю огромнейшую благодарность ещё раз. Вы привели мне прекрасный пример того, как стоило бы писать код в будущем :)
at0mGaming
UNец
 
Сообщения: 15
Зарегистрирован: 23 ноя 2021, 22:18

Re: PlayerPrefs на android не сохраняет.

Сообщение 1max1 30 ноя 2021, 00:18

Вау, круто, ты осознал собственный говно код, левел ап, чо... :ymparty:
Аватара пользователя
1max1
Адепт
 
Сообщения: 4917
Зарегистрирован: 28 июн 2017, 10:51

Re: PlayerPrefs на android не сохраняет.

Сообщение at0mGaming 30 ноя 2021, 12:16

1max1 писал(а):Вау, круто, ты осознал собственный говно код, левел ап, чо... :ymparty:

Ух ты, указали новичку на то, что он новичок!
+100 к высокомерию, +500 к самоуверенности!
Разблокировано достижение: Крутой программист!
at0mGaming
UNец
 
Сообщения: 15
Зарегистрирован: 23 ноя 2021, 22:18

Re: PlayerPrefs на android не сохраняет.

Сообщение 1max1 30 ноя 2021, 15:15

А зачем ты кичишься тем что понял свою ошибку? Знаешь сколько тысяч раз это бывает у прогеров? Это так обыденно что аж рябит в глазах когда кто-то кричит всем "ля какой я крутой всё понял, а вы балбесосы не смогли". Я даже больше скажу, зачастую никто и не будет искать за тебя баги, да никто и не должен в принципе.
Аватара пользователя
1max1
Адепт
 
Сообщения: 4917
Зарегистрирован: 28 июн 2017, 10:51

Re: PlayerPrefs на android не сохраняет.

Сообщение at0mGaming 30 ноя 2021, 18:13

1max1 писал(а):А зачем ты кичишься тем что понял свою ошибку? Знаешь сколько тысяч раз это бывает у прогеров? Это так обыденно что аж рябит в глазах когда кто-то кричит всем "ля какой я крутой всё понял, а вы балбесосы не смогли". Я даже больше скажу, зачастую никто и не будет искать за тебя баги, да никто и не должен в принципе.

Я написал это для тех, у кого в будущем возникнет такая же проблема, и они захотят в ней разобраться) Вот и всё)
А зачем тогда нужны форумы, если никто друг другу не помогает и не делится опытом? Разве тогда в них не отпадает надобность? Можем подискутировать на эту тему в личке, чтобы не зафлуживать раздел)
at0mGaming
UNец
 
Сообщения: 15
Зарегистрирован: 23 ноя 2021, 22:18

Пред.

Вернуться в iPhone & Android

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 3