حفظ اللعبة
جزء من قسم هندسة الألعاب في 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 عند الخروج العادي، لكن يمكن للهاتف إغلاق اللعبة في الخلفية دون تشغيلها.
التحدي
متوسطيتجوّل المستكشف في الجزيرة باستخدام الأسهم، ويزرع مفتاح المسافة علمًا في المكان الذي يقف فيه المستكشف. اجعل الجزيرة لعبة محفوظة في الملف 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
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء