Oyunu Kaydetme
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 25 / 50.
Bir kayıtlı oyun, JSON olarak yazılan tek bir nesnedir. Kayıt için gereken her şeyi bir [System.Serializable] sınıfına koy, oyun verilerinden doldur ve JsonUtility.ToJson sonucunu oyundan daha uzun süre varlığını sürdüren bir yere yaz. Bu zindan; katı, altını ve bulunan anahtarları saklar:
[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, Unity'nin oyuna her platformda verdiği, oyunlar arasında ve güncellemeler boyunca korunan bir klasördür. Path.Combine, bunu ve bir dosya adını platformun ayırıcısını kullanarak birleştirir. File.WriteAllText(path, text) dosyayı yazar ve varsa eskisinin yerine geçer, File.Exists dosyanın var olup olmadığını söyler ve File.ReadAllText içeriğini okur (üçü de System.IO içindedir). Oyunun kendi klasörü salt okunur olabilir; bu nedenle kayıtlar persistentDataPath konumuna, başka hiçbir yere değil, yazılır. Yolu Awake veya Start içinde oluştur: Unity, alan başlatıcısında persistentDataPath kullanılmasına izin vermez.
Kayıt sınıfı yalnızca kayıt için gerekenleri tutar; oyun, kaydetmek için değerleri bu sınıfa, yüklemek için de sınıftan alıp kopyalar. Küçük bir kayıt, dosya yerine PlayerPrefs içine yazılabilir: PlayerPrefs.SetString("dungeon", json) ve PlayerPrefs.GetString("dungeon") aynı JSON'u saklar. Saklamaya değer bir şey olduğunda, bir kontrol noktasında veya Kaydet düğmesiyle kaydet: OnApplicationQuit normal çıkışta çalışır, ancak telefon bir oyunu arka plandayken bu metodu çalıştırmadan kapatabilir.
Görev
OrtaKâşif ok tuşlarıyla adada dolaşır ve Space, kâşifin bulunduğu yere bir bayrak diker. island.json dosyasında adayı kayıtlı bir oyun hâline getir:
IslandSave.csiçinde,IslandSaveadlı, herkese açıkplayerPositionalanına (bir Vector3) veflagsalanına (birList<Vector3>) sahip bir[System.Serializable]sınıfı yaz.- Save düğmesinin çağırdığı
Save(), kâşifin konumunu ve bayrakları JSON olarakApplication.persistentDataPathiçindekiisland.jsondosyasına yazar. Start()içinde,island.jsonvarsa kâşifi kayıtlı konumuna geri koy ve kayıtlı her bayrağı yeniden dikmek içinPlantFlagkullan; böylece bayraklar bir sonraki kayıt için listede olur.
Play'e bas, birkaç bayrak dik ve Save'e tıkla, ardından Stop'a ve tekrar Play'e bas. Sonra Check'e tıkla.
Kendin dene
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");
// island.json dosyasını burada yükle
}
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);
}
// Save düğmesi bunu çağırır
public void Save()
{
// Oyuncunun konumunu ve bayrakları island.json dosyasına yaz
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest