Menu
CoddyTech

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.

challenge icon

Görev

Orta

Kâş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.cs içinde, IslandSave adlı, herkese açık playerPosition alanına (bir Vector3) ve flags alanına (bir List<Vector3>) sahip bir [System.Serializable] sınıfı yaz.
  • Save düğmesinin çağırdığı Save(), kâşifin konumunu ve bayrakları JSON olarak Application.persistentDataPath içindeki island.json dosyasına yazar.
  • Start() içinde, island.json varsa kâşifi kayıtlı konumuna geri koy ve kayıtlı her bayrağı yeniden dikmek için PlantFlag kullan; 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
    }
}
quiz iconKendini test et

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