Wczytywanie i wartości domyślne
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 26 z 50.
Wczytywanie musi radzić sobie z zapisami, których brakuje lub które są niekompletne. Gra wyścigowa zapisuje obiekt RaceSave; w wersji 2 gry dodano musicVolume:
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}Nowy gracz nie ma pliku, a File.ReadAllText wywołane dla nieistniejącego pliku zgłasza wyjątek FileNotFoundException, dlatego najpierw sprawdź File.Exists i zacznij od new RaceSave(): 0 trofeów, Rookie Kart i głośność 0.8 — wartości inicjalizatorów pól. Plik gracza korzystającego ze starszej wersji 1 zawiera {"trophies":3,"car":"Red Racer"}. FromJson tworzy nowy obiekt RaceSave, co uruchamia inicjalizatory pól, a następnie ustawia tylko klucze występujące w JSON-ie, więc musicVolume ma wartość 0.8. Klucz, dla którego klasa nie ma pola, jest ignorowany. Nowa wersja gry może więc odczytywać stare zapisy, o ile każde nowe pole ma inicjalizator z sensowną wartością.
JsonUtility.FromJsonOverwrite(json, obj) wypełnia istniejący już obiekt zamiast tworzyć nowy i pozostawia bez zmian każde pole, którego brakuje w JSON-ie. FromJson nie może utworzyć MonoBehaviour ani ScriptableObject (Unity zgłasza Cannot deserialize JSON to new instances of type 'RaceSettings.'), dlatego zasób z ustawieniami wczytuje się przez nadpisanie: JsonUtility.FromJsonOverwrite(json, settings);. Nadpisywanie zachowuje również wartości, które obiekt już zawiera, takie jak wartości nadane mu przez Inspector — FromJson przywróciłby inicjalizatory klasy.
Wyzwanie
ŚredniWirtualny pupil wczytuje pet.json po uruchomieniu gry, a klawisz spacji karmi pupila i zapisuje jego dane. Wczytywanie może się nie powieść na dwa sposoby:
- Nowy gracz nie ma pliku
pet.json, a metoda Start kończy działanie z wyjątkiem FileNotFoundException. Jeśli plik nie istnieje, pozostaw pupila skonfigurowanego w Inspectorze (Biscuit, głód 30, szczęście 80, piłka) i wyświetl w loguA new pet: Biscuit. - W wersji 1 gry zapisywane były tylko pola
petNameihunger;happinessitoysdodano w wersji 2 (zobacz PetSave.cs). Wczytanie starego zapisu za pomocą FromJson ustawia wartość 50 zdefiniowaną w klasie i brak zabawek zamiast wartości z Inspectora. Wczytaj istniejący plik dopetza pomocąJsonUtility.FromJsonOverwrite, aby pola, których brakuje w pliku, zachowały wartości z Inspectora, a następnie wyświetl powitanie z wczytanym imieniem, na przykładWelcome back, Mochi.
Naciśnij Play i nakarm pupila, następnie Stop i ponownie Play, a potem Check.
Spróbuj swoich sił
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrypcja w OnEnablePola UnityEventZdarzenia sterują interfejsemPodsumowanie: wyskakujące okno osiągnięcia6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePowtórka: sloty zapisu