أصول البيانات
جزء من قسم هندسة الألعاب في 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.
التحدي
متوسطانقل إعدادات البطل إلى أصل بيانات.
- في
HeroData.cs، اكتبpublic class HeroData : ScriptableObjectمعstring heroNameوfloat moveSpeedوColor colorعامة. - ضع
[CreateAssetMenu(menuName = "Heroes/Hero Data")]في السطر الذي يسبقه. - في
Hero.cs، استبدل الحقول الثلاثة بـpublic HeroData data;واقرأdata.heroNameوdata.moveSpeedوdata.colorبدلًا منها.
اضغط على «العب»: يمشي الفارس الأحمر بسرعة 3. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
// HeroData: اسم البطل وسرعته ولونه، بوصفها ScriptableObject
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاق5ScriptableObjects
أصول البياناتإحصاءات الأسلحةالإعدادات المشتركةأنقذ الرياحالموجات كبياناتمراجعة: قاعدة بيانات العناصرمراجعة: الشراء من المتجرتدرّب بنفسك: Playground لـ Unity