Menu
CoddyTech

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

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

تنمو الجزر والقرع في لعبة مزرعة. تستغرق الجزرة 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

التحدي

متوسط

انقل إعدادات البطل إلى أصل بيانات.

  1. في HeroData.cs، اكتب public class HeroData : ScriptableObject مع string heroName وfloat moveSpeed وColor color عامة.
  2. ضع [CreateAssetMenu(menuName = "Heroes/Hero Data")] في السطر الذي يسبقه.
  3. في Hero.cs، استبدل الحقول الثلاثة بـ public HeroData data; واقرأ data.heroName وdata.moveSpeed وdata.color بدلًا منها.

اضغط على «العب»: يمشي الفارس الأحمر بسرعة 3. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

// HeroData: اسم البطل وسرعته ولونه، بوصفها ScriptableObject

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

تدرّب بنفسك: Playground لـ Unity