Wczytywanie i wartości domyślne
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 32 z 64.
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 brakującego pliku zgłasza wyjątek FileNotFoundException, więc 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, uruchamia inicjalizatory pól, a następnie ustawia tylko te klucze, które zawiera JSON, więc musicVolume ma wartość 0.8. Klucz, dla którego klasa nie ma pola, jest ignorowany. Dzięki temu nowa wersja gry może odczytywać stare zapisy, o ile każde nowe pole ma inicjalizator z rozsądną wartością.
JsonUtility.FromJsonOverwrite(json, obj) wypełnia istniejący obiekt zamiast tworzyć nowy i pozostawia bez zmian wszystkie pola, których brakuje w JSON. FromJson nie może utworzyć obiektu MonoBehaviour ani ScriptableObject (Unity zgłasza Cannot deserialize JSON to new instances of type 'RaceSettings.'), dlatego zasób ustawień wczytuje się przez nadpisanie go: JsonUtility.FromJsonOverwrite(json, settings);. Nadpisywanie zachowuje też wartości, które obiekt już ma, na przykład te nadane mu przez Inspector; użycie FromJson przywróciłoby natomiast wartości inicjalizatorów klasy.
Wyzwanie
ŚredniBezpiecznie wczytaj pet.json dla nowych graczy i starszych zapisów.
- W
Start()zastąp linię FromJson warunkiemif (File.Exists(path))i częściąelse. - Jeśli plik istnieje, wczytaj go do pola pet w Inspectorze:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, a następnie wyświetl komunikatWelcome back, Mochizpet.petName. - Jeśli plik nie istnieje, w ten sam sposób wyświetl komunikat
A new pet: Biscuit.
Naciśnij „Graj”, nakarm zwierzaka, a następnie naciśnij Stop i „Graj”: pojawi się komunikat powitalny. Potem naciśnij „Sprawdź”.
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;
}
}
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrybuj w OnEnablePola UnityEventZdarzenia sterują UIPodsumowanie: popup osiągnięciaPodsumowanie: timer popupu6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePodsumowanie: sloty zapisuWybierz i usuń slotPoćwicz samodzielnie: Edytor online Unity