Збереження прогресу гравця в грі Unity


22

Я роблю гру за допомогою ігрового двигуна Unity. Я хочу зберегти прогрес гравця, включаючи рівень, очки досвіду, вибраний персонаж тощо. На даний момент я використовую програмові засоби програвання, але хочу знати, чи це буде працювати для геймерів, які також запускають цю гру на своїх мобільних пристроях (Android / iOS) як настільні (OSX / ПК)? Якщо ні, то як мені зберегти цю інформацію? Я хочу автоматично зберегти прогрес гравця після очищення кожного етапу.

Відповіді:


30

PlayerPrefs працюватиме на платформі, але це не рекомендується для збереження файлів прогресу в грі, оскільки це небезпечно. Як файл простого тексту, гравець може легко відкрити його та змінити вміст на обман, або змусити вашу гру поводитися непередбачувано. Це також не гарантовано залишатися поруч.

PlayerPrefs призначений для несуттєвої інформації про переваги, як-от керування картою або налаштуваннями музики / sfx - речі, які програвач може вільно змінити, все-таки не втратять жахливо, якби вони (наприклад, у Windows) використали точку відновлення системи та програли деякі дані їх реєстру. Якби це втратило свої високі бали чи прогрес кампанії, гравці виправдано засмутилися б!

Натомість рекомендується зберегти прогрес у геймплейі у вашому власному файлі (як правило, бінарний, можливо зашифрований чи підписаний, якщо ви хочете зробити його складнішим, але дивіться коментар Філіпа нижче щодо цього).

Ви можете використовувати Application.persistentDataPath, щоб отримати надійне місце збереження на кожній платформі. Зазвичай це в папці даних користувачів, яка не буде видалена у таких випадках, як приклад вище.

Коли у вас є шлях для збереження, ви можете використовувати звичайні методи C # IO для створення, запису та читання файлу. Деталі будуть сильно відрізнятися залежно від формату та структури збереженого файлу, тому якщо у вас виникли проблеми, краще задати нове запитання, в якому детально описується, що ви намагаєтеся зробити та де ви застрягли.


30
На мою думку, шифрування та підписання ваших файлів збереження гри - це просто змія. Це не безпечно, оскільки вам потрібно зберігати ключі та алгоритми у вашій грі, у якій виконується гра, де досвідчений хакер може отримати доступ до них. Це також безглуздо. Коли це одиночна гра: навіщо турбуватися? Нехай гравець насолоджується грою так, як хоче. Коли це багатокористувацька гра, вам краще зберегти все на сервері, де це безпечно від маніпуляцій.
Філіпп

5
@ SamedTarıkÇETİN Існує важлива відмінність між контуром даних (місцем, де встановлена ​​ваша гра) і стійким шляхом даних (надійне місце для збереження нових даних). На деяких платформах вбудована гра не може записати на встановлений шлях даних, тому збереження у постійному розташуванні шляху даних рекомендується загальним правилом.
DMGregory

2
Хоча я погоджуюся з @Philipp, що зберігання на стороні клієнта ніколи не є справді захищеним, і що у багатьох випадках нам не потрібно з великими можливостями щодо забезпечення гри для одиноких гравців, кількість захищених прав або невміння застосовувати, в кінцевому рахунку, це вибір. кожен творець повинен зробити для себе. За допомогою цієї відповіді я просто хочу надати запитувачу інформацію, щоб зробити усвідомлений вибір про те, що підходить для їх гри.
DMGregory

1
З одного боку, я погоджуюся з @Philipp, але я також бачив / працював із серіалізованим файлом збереження, який був абсолютно нерозбірливим для роботи в текстовому редакторі. Так, я, мабуть, міг придумати, як зайти і внести якісь зміни або іншу зміну, але так як файл виглядав як 2 мега сирого дванадцятимісного числа, це було б зовсім непростим шляхом. У таких випадках розбирати його намагаються лише найжорсткіші з людей, і результати будуть специфічними для цієї точки гри (додавання ще однієї одиниці для збереження виштовхує всі наступні дані нижче за течією). Знову ж таки, це не передбачалося бути захищеним.
Draco18s

2
@ShantanuSingh, не зберігаючи їх у програмі PlayerPrefs. Така інформація повинна зберігатися у віддаленій базі даних та запитуватися під час запуску програми. Для сумісності, коли підключення до Інтернету недоступне, поверніться до локального захищеного збереженого файлу (тобто зашифрованого). Значення бази даних, коли вони є, повинні замінити локальні. Можливо, є додатки для придбання додатків, які також керують іншими способами, але це, ймовірно, буде "потрібен Інтернет", зламаний (навіть зашифрований файл не на 100% безпечний), або, як відомо, у цьому коментарі.
Draco18s


-1

PlayerPrefs - це магазин K / V, призначений "просто працювати" незалежно від платформи, для якої ви будуєте. Я кажу просто продовжуйте користуватися ним, якщо у вас немає вагомих причин цього не робити.


Я думаю, що питання було досить багато, якщо є вагомі причини не використовувати PlayerPrefs (так, є). Як такий я відповів на цю відповідь, оскільки він не відповідає на запитання.
Пітер - Унбан Роберт Харві

-1

Тож найкращий спосіб - це збереження на сервері? Перетворити всю необхідну інформацію для збереження в рядок json і зберегти її на власному сервері mysql у вигляді рядкових даних, а коли потрібно завантажити, підключитися до сервера та відновити його?


4
Це не відповідь на запитання. Якщо у вас є питання, задайте як нове запитання .
Сурав Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.