Menu
CoddyTech
flag Ar iconالعربيةdown icon

حفظ اللعبة

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 25 من 50.

ملف الحفظ هو كائن واحد يُكتب بتنسيق JSON. ضع كل ما يحتاجه الحفظ في فئة [System.Serializable]، واملأها من اللعبة، واكتب ناتج JsonUtility.ToJson لها في مكان يبقى بعد انتهاء اللعبة. تحتفظ هذه الزنزانة بالطابق والذهب والمفاتيح التي عُثر عليها:

[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 للعبة على كل منصة، ويظل محفوظًا بين مرات تشغيل اللعبة وعبر التحديثات. يضم Path.Combine هذا المسار واسم ملف باستخدام الفاصل الخاص بالمنصة. تكتب File.WriteAllText(path, text) الملف، وتستبدل ملفًا قديمًا إن وُجد، بينما تخبرك File.Exists ما إذا كان الملف موجودًا، وتقرأ File.ReadAllText محتواه (والثلاثة من System.IO). قد يكون مجلد اللعبة نفسه للقراءة فقط، لذا تُحفظ الملفات في persistentDataPath وليس في أي مكان آخر. أنشئ المسار في Awake أو Start: ترفض Unity استخدام persistentDataPath في مُهيّئ حقل.

لا تحتوي فئة الحفظ إلا على ما يحتاجه الحفظ، وتنسخ اللعبة القيم إليها للحفظ ومنها للتحميل. يمكن حفظ ملف صغير في PlayerPrefs بدلًا من ملف: يحتفظ PlayerPrefs.SetString("dungeon", json) وPlayerPrefs.GetString("dungeon") ببيانات JSON نفسها. احفظ عند حدوث أمر يستحق الاحتفاظ به، عند نقطة حفظ أو باستخدام زر حفظ: تُشغَّل OnApplicationQuit عند الخروج العادي، لكن يمكن للهاتف إغلاق اللعبة في الخلفية دون تشغيلها.

challenge icon

التحدي

متوسط

يتجوّل المستكشف في الجزيرة باستخدام الأسهم، ويزرع مفتاح المسافة علمًا في المكان الذي يقف فيه المستكشف. اجعل الجزيرة لعبة محفوظة في الملف island.json:

  • في IslandSave.cs، اكتب فئة [System.Serializable] باسم IslandSave، تحتوي على الحقلين العامّين playerPosition (من النوع Vector3) وflags (من النوع List<Vector3>).
  • تكتب Save()، التي يستدعيها زر Save، موضع المستكشف والأعلام بتنسيق JSON إلى island.json في Application.persistentDataPath.
  • في Start()، إذا كان island.json موجودًا، فأعِد المستكشف إلى الموضع المحفوظ وازرع كل علم محفوظ مجددًا باستخدام PlantFlag، حتى تكون الأعلام في القائمة عند الحفظ التالي.

اضغط Play، وازرع بعض الأعلام ثم انقر Save، وبعدها Stop ثم Play مرة أخرى. ثم Check.

جرّب بنفسك

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 هنا
    }

    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 هذا
    public void Save()
    {
        // اكتب موضع اللاعب والأعلام في island.json
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity