Oyunu Kaydetme
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 31 / 64.
Bir kayıt oyunu, JSON olarak yazılan tek bir nesnedir. Kaydın ihtiyaç duyduğu her şeyi bir [System.Serializable] sınıfına koy, bu sınıfı oyundaki verilerle doldur ve JsonUtility.ToJson sonucunu oyundan daha uzun süre saklanan bir yere yaz. Bu zindan; katı, altını ve bulunan anahtarları kaydeder:
[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 sağladığı; oyunlar arasında ve güncellemeler boyunca korunan bir klasördür. Path.Combine, bu klasör yolunu ve bir dosya adını platformun ayırıcı karakterini kullanarak birleştirir. File.WriteAllText(path, text) dosyayı yazar ve varsa eski dosyanın üzerine yazar, File.Exists dosyanın var olup olmadığını bildirir, File.ReadAllText ise dosyanın içeriğini okur (üçü de System.IO içindedir). Oyunun kendi klasörü salt okunur olabilir; bu nedenle kayıtları persistentDataPath içine, başka hiçbir yere değil, yaz. 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 kaydın ihtiyaç duyduğu verileri tutar; oyun, kaydetmek için değerleri bu sınıfa, yüklemek için de bu sınıftan 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üğmesini kullanarak kaydet: OnApplicationQuit normal bir çıkışta çalışır, ancak telefon arka plandaki bir oyunu bu işlem gerçekleşmeden kapatabilir.
Görev
OrtaAdayayı island.json dosyasına kaydet.
IslandSave.csdosyasında,public Vector3 playerPosition;vepublic List<Vector3> flags;içeren bir[System.Serializable]sınıfıIslandSaveyaz.Start()içindepathdeğeriniPath.Combine(Application.persistentDataPath, "island.json")olarak ayarla.Save(),transform.positionveflagsdeğerlerinden oluşan bir IslandSave'i JSON olarakpathkonumuna yazar.Start(), mevcut bir dosyayı yeniden okur: konumu ve her bayrak içinPlantFlagçağrısını.
“Oyna”'ya bas, bayraklar dik, Kaydet'e bas, oyunu durdur ve yeniden “Oyna”'ya bas: bayraklar geri gelir. Ardından “Kontrol et”'e bas.
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
}
}
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground