Zapisywanie postępów gracza w grze Unity

22

Tworzę grę za pomocą silnika gry Unity. Chcę zapisać postępy gracza, w tym poziom, punkty doświadczenia, wybraną postać itp. Obecnie używam prefiksów graczy, ale chcę wiedzieć, czy to zadziała dla graczy, którzy uruchomią tę grę na swoich urządzeniach mobilnych (Android / iOS) jako komputery stacjonarne (OSX / PC)? Jeśli nie, to jak mam zapisać te informacje? Chcę automatycznie zapisywać postępy gracza po wyczyszczeniu każdego etapu.

Shantanu Singh
źródło

Odpowiedzi:

30

PlayerPrefs będzie działać na różnych platformach, ale nie jest to zalecane do zapisywania plików postępów gry, ponieważ jest niepewny. Jako plik w postaci zwykłego tekstu gracz może go łatwo otworzyć i zmienić zawartość w celu oszukiwania lub sprawić, że gra zachowuje się nieprzewidywalnie. Nie ma też gwarancji pozostania w pobliżu.

PlayerPrefs jest przeznaczony do nieistotnych informacji o preferencjach, takich jak mapowanie kontrolne lub ustawienia muzyki / sfx - rzeczy, które odtwarzacz może i tak dowolnie zmieniać, i nie przegapiłby strasznie, gdyby (na przykład w systemie Windows) użył punktu przywracania systemu i stracił niektóre informacje o rejestrze. Gdyby to straciło swoje wysokie wyniki lub postępy kampanii, gracze byliby słusznie zdenerwowani!

Zamiast tego zaleca się zapisywanie postępów gry we własnym pliku (zwykle binarnym, być może zaszyfrowanym lub podpisanym, jeśli chcesz utrudnić modyfikację, ale patrz komentarz Filipa na ten temat poniżej).

Możesz użyć Application.persistentDataPath, aby uzyskać niezawodną lokalizację zapisu na każdej platformie. Zazwyczaj znajduje się w folderze danych użytkownika, który nie zostanie usunięty w przypadkach takich jak w powyższym przykładzie.

Gdy masz już ścieżkę do zapisywania, możesz użyć zwykłych metod C # IO do tworzenia, pisania i odczytywania pliku. Szczegóły będą się bardzo różnić w zależności od formatu i struktury zapisywanego pliku, więc jeśli napotkasz problemy, najlepiej zadać nowe pytanie szczegółowo, co próbujesz zrobić i gdzie utkniesz.

DMGregory
źródło
30
Moim zdaniem szyfrowanie i podpisywanie plików zapisanych w grze to po prostu snakeoil. Nie jest to bezpieczne, ponieważ musisz przechowywać klucze i algorytmy w pliku wykonywalnym gry, gdzie wykwalifikowany haker może uzyskać do nich dostęp. To też nie ma sensu. Gdy jest to gra dla jednego gracza: po co zawracać sobie głowę? Pozwól graczowi cieszyć się grą tak, jak chce. Gdy jest to gra wieloosobowa, powinieneś raczej zapisywać wszystko na serwerze, gdzie jest to bezpieczne przed manipulacją.
Filipiny,
5
@ SamedTarıkÇETİN Istnieje istotna różnica między ścieżką danych (miejsce instalacji gry) a ścieżką trwałych danych (niezawodna lokalizacja do zapisywania nowych danych). Na niektórych platformach wbudowana gra nie może zapisywać na zainstalowanej ścieżce danych, dlatego zaleca się zapisywanie w lokalizacji trwałej ścieżki danych jako ogólną zasadę.
DMGregory
2
Chociaż zgadzam się z @Philipp, że pamięć masowa po stronie klienta nigdy nie jest naprawdę bezpieczna, i że w wielu przypadkach nie musimy być zbyt zajęci zabezpieczaniem gier dla jednego gracza, ilość bezpieczeństwa lub zaciemnienia, które należy zastosować, jest ostatecznie wyborem każdy twórca musi zrobić dla siebie. Tą odpowiedzią chcę tylko przekazać pytającemu informacje, aby dokonali świadomego wyboru, co jest odpowiednie dla ich gry.
DMGregory
1
Z jednej strony zgadzam się z @Philipp, ale widziałem / pracowałem z serializowanym plikiem zapisu, z którym nie można było pracować w edytorze tekstów. Tak, prawdopodobnie mogłem wymyślić, jak wejść i dokonać jakiejś zmiany, ale ponieważ plik wyglądał na 2 megawity w systemie szesnastkowym, ustalenie tego byłoby dość trudne. W takich przypadkach tylko najbardziej zagorzali ludzie próbowaliby go zdemontować, a wyniki byłyby specyficzne dla tego punktu w grze (dodanie jednej dodatkowej jednostki do zapisu wypycha wszystkie kolejne dane w dół). Potem znowu, nie było przeznaczone do być bezpieczne.
Draco18s,
2
@ShantanuSingh, nie przechowując ich w PlayerPrefs. Tego rodzaju informacje powinny być przechowywane w zdalnej bazie danych i wymagane podczas uruchamiania aplikacji. Aby zachować zgodność, gdy połączenie internetowe nie jest dostępne, wróć do lokalnego bezpiecznego zapisanego pliku (to znaczy: zaszyfrowanego). Wartości bazy danych, jeśli są dostępne, powinny zastąpić wartości lokalne. Mogą istnieć wtyczki zakupowe w aplikacji, które radzą sobie również z innymi sposobami, ale prawdopodobnie będzie to albo „wymagane przez Internet”, możliwe do włamania (nawet zaszyfrowany plik nie jest w 100% bezpieczny), lub zgodnie z tym komentarzem.
Draco18s,
-1

PlayerPrefs to sklep K / V zaprojektowany tak, aby „po prostu działał” bez względu na platformę, którą budujesz. Mówię tylko, że używaj go, chyba że masz ważny powód, aby tego nie robić.

Grenlandia
źródło
Myślę, że pytanie było dość ważne, czy istnieją ważne powody, aby nie używać PlayerPrefs (tak, są). Jako taki głosowałem za odpowiedzią, ponieważ nie odpowiada na pytanie.
Peter - Unban Robert Harvey
-1

Więc najlepszym sposobem jest oszczędzanie po stronie serwera? Konwertuj wszystkie zapisane potrzebne informacje na ciąg json i przechowuj je na własnym serwerze mysql jako dane ciągu, a kiedy trzeba załadować, połączyć się z serwerem i przywrócić?

twórca
źródło
4
To nie jest odpowiedź na pytanie. Jeśli masz pytanie, zadaj je jako nowe pytanie .
Sourav Paul,