Zapisz grę
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 31 z 64.
Stan gry to jeden obiekt zapisany w formacie JSON. Umieść wszystko, co jest potrzebne do zapisu, w klasie [System.Serializable], wypełnij ją danymi z gry i zapisz wynik JsonUtility.ToJson w miejscu, które przetrwa zamknięcie gry. Ten loch zapisuje piętro, złoto i znalezione klucze:
[System.Serializable]
public class DungeonSave
{
public int floor;
public int gold;
public List<string> keys;
}using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Dungeon : MonoBehaviour
{
public int floor = 1;
public int gold;
public List<string> keys = new List<string>();
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "dungeon.json");
if (File.Exists(path))
{
DungeonSave save = JsonUtility.FromJson<DungeonSave>(File.ReadAllText(path));
floor = save.floor;
gold = save.gold;
keys = save.keys;
}
}
public void Save()
{
DungeonSave save = new DungeonSave();
save.floor = floor;
save.gold = gold;
save.keys = keys;
File.WriteAllText(path, JsonUtility.ToJson(save));
}
}Application.persistentDataPath to folder, który Unity udostępnia grze na każdej platformie; jego zawartość jest zachowywana między uruchomieniami gry i po aktualizacjach. Path.Combine łączy tę ścieżkę z nazwą pliku, używając separatora właściwego dla danej platformy. File.WriteAllText(path, text) zapisuje plik, zastępując poprzedni, File.Exists sprawdza, czy plik istnieje, a File.ReadAllText odczytuje jego zawartość (wszystkie trzy metody pochodzą z System.IO). Folder samej gry może być tylko do odczytu, dlatego zapisy trafiają do persistentDataPath i nigdzie indziej. Utwórz ścieżkę w Awake lub Start: Unity nie pozwala używać persistentDataPath w inicjalizatorze pola.
Klasa zapisu przechowuje tylko to, co jest potrzebne do zapisu, a gra kopiuje do niej wartości podczas zapisywania, a z niej — podczas wczytywania. Mały zapis można przechowywać w PlayerPrefs zamiast w pliku: PlayerPrefs.SetString("dungeon", json) i PlayerPrefs.GetString("dungeon") przechowują ten sam JSON. Zapisuj dane, gdy wydarzy się coś wartego zachowania, przy punkcie kontrolnym lub za pomocą przycisku zapisu: OnApplicationQuit jest wywoływane przy normalnym zamknięciu gry, ale telefon może zamknąć grę działającą w tle bez wywołania tej metody.
Wyzwanie
ŚredniZapisz wyspę w pliku island.json.
- W pliku
IslandSave.csnapisz klasę[System.Serializable]IslandSavez polamipublic Vector3 playerPosition;ipublic List<Vector3> flags;. - W metodzie
Start()ustawpathnaPath.Combine(Application.persistentDataPath, "island.json"). - Metoda
Save()zapisuje jako JSON wpathobiekt IslandSave zawierającytransform.positioniflags. - Metoda
Start()odczytuje istniejący plik: pozycję oraz wywołujePlantFlagdla każdej flagi.
Naciśnij „Graj”, umieść flagi, naciśnij Zapisz, zatrzymaj grę i naciśnij „Graj”: flagi wracają. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
public class Explorer : MonoBehaviour
{
public GameObject flagPrefab;
public float speed = 4f;
private List<Vector3> flags = new List<Vector3>();
private InputAction moveAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
// Wczytaj tutaj island.json
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
transform.Translate(new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime);
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
PlantFlag(transform.position);
}
}
void PlantFlag(Vector3 position)
{
flags.Add(position);
Instantiate(flagPrefab, new Vector3(position.x, 0.5f, position.z), Quaternion.identity);
}
// Przycisk Save wywołuje tę metodę
public void Save()
{
// Zapisz pozycję gracza i flagi do island.json
}
}
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: FindNearestPoćwicz samodzielnie: Edytor online Unity