احفظ اللعبة
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 31 من 64.
لعبة الحفظ هي كائن واحد يُكتب بصيغة 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 عند الخروج بالطريقة المعتادة، لكن قد يُغلق الهاتف اللعبة في الخلفية من دون تشغيلها.
التحدي
متوسطاحفظ الجزيرة في island.json.
- في
IslandSave.cs، اكتب صنفًا[System.Serializable]باسمIslandSaveيتضمّنpublic Vector3 playerPosition;وpublic List<Vector3> flags;. - في
Start()، عيّنpathإلىPath.Combine(Application.persistentDataPath, "island.json"). - تكتب
Save()كائنًا منIslandSaveيحتوي علىtransform.positionوflagsإلىpathبصيغة JSON. - يقرأ
Start()ملفًا موجودًا: الموضع، ويستدعيPlantFlagلكل راية.
اضغط «العب»، وازرع الرايات، واضغط حفظ، ثم أوقف اللعبة واضغط «العب»: ستعود الرايات. ثم اضغط «تحقق».
جرّب بنفسك
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
}
}
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity