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

أصول البيانات

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

تنمو في لعبة مزرعة الجزر والقرع. تستغرق الجزرة 30 ثانية لتنمو وتُباع مقابل 5 عملات، بينما يستغرق القرع 90 ثانية ويُباع مقابل 40. هذه الأرقام تخص المحصول، لا نبتة بعينها: فعندما تكون حقول Inspector في سكربت Plant، تحتفظ كل جزرة في كل مشهد بنسختها الخاصة من القيمتين 30 و5، وأي تغيير يتطلب العثور عليها كلها. يحتفظ ScriptableObject ببيانات كهذه في أصل، وهو ملف في المشروع يمكن لأي عدد من الكائنات الإشارة إليه. ترث فئته من ScriptableObject بدلًا من MonoBehaviour:

using UnityEngine;

[CreateAssetMenu(fileName = "NewPlant", menuName = "Farm/Plant Data")]
public class PlantData : ScriptableObject
{
    public string plantName;
    public float growTime;
    public int sellPrice;
}

يضيف [CreateAssetMenu] الفئة إلى قائمة Create في نافذة Project. انقر بزر الفأرة الأيمن في نافذة Project، واختر Create > Farm > Plant Data، وسيُنشئ Unity أصلًا باسم NewPlant؛ أعد تسميته إلى Carrot، وحدده، ثم أدخل Carrot و30 و5 في حقوله ضمن Inspector. يُنشأ أصل Pumpkin بالطريقة نفسها. توضع الفئة في ملف يحمل اسمها، PlantData.cs، كما هو الحال مع MonoBehaviour.

يبقى السلوك في MonoBehaviour يحتوي على حقل من نوع الأصل. اسحب أصل Carrot إلى ذلك الحقل، وسيقرأ السكربت الأرقام من خلاله:

public class Plant : MonoBehaviour
{
    public PlantData data;
    private float age;

    void Update()
    {
        age += Time.deltaTime;
        if (age >= data.growTime)
        {
            Debug.Log(data.plantName + " is ready, worth " + data.sellPrice);
            enabled = false;
        }
    }
}

لا يوجد ScriptableObject على أي GameObject ولا في أي مشهد. ليس له Transform، ولا يستدعي Unity الدالتين Update أو Start فيه مطلقًا: فهو يحتفظ بالبيانات، بينما يحتفظ Plant بالسلوك. عندما تشير 200 جزرة إلى أصل Carrot واحد، فإن ضبط growTime على 25 يغيّرها جميعًا. في الكود، يُنشأ مثيل باستخدام ScriptableObject.CreateInstance<PlantData>()، وليس باستخدام new.

challenge icon

التحدي

متوسط

يتحرك البطل في الساحة باستخدام الأسهم. اسمه وسرعته ولونه حقول في نص Hero، وسيعيد كل بطل جديد نسخها. انقلها إلى أصل:

  • في HeroData.cs، اكتب HeroData، وهو ScriptableObject يضم الحقول العامة heroName (سلسلة نصية) وmoveSpeed (عدد عشري) وcolor (لون). أضف إليه [CreateAssetMenu] باسم القائمة Heroes/Hero Data.
  • في Hero.cs، استبدل الحقول الثلاثة بحقل عام واحد data من النوع HeroData، واستخدم قيم الأصل حيث كان النص يستخدم حقوله الخاصة.

يحتوي المشروع على أصل Knight أُنشئ باستخدام تلك القائمة (Knight، السرعة 3، أحمر)، ويضعه Inspector في حقل data الخاص بالبطل. اضغط Play وحرّك Knight في الأرجاء، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

// HeroData: اسم البطل وسرعته ولونه، على هيئة ScriptableObject
quiz iconاختبر نفسك

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

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