بيانات الأعداء
الدرس 2 من 18 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
تحتوي لعبة الدفاع عن الأبراج على أنواع من الأعداء: جنود مشاة، وعدّاؤون سريعون، ودبابات بطيئة. يمشي كل جندي مشاة بالسرعة نفسها ويبدأ بالصحة نفسها، لذا تنتمي هذه القيم إلى النوع، لا إلى عدو واحد. توضع في أصل ScriptableObject، واحد لكل نوع، ويشير إليه كل عدو من هذا النوع. غيّر الأصل، وسيتغير معه كل عدو من ذلك النوع.
يجب ألا يحتفظ الأصل بحالة عدو واحد. فالجندي الذي تلقى ضربة صحته أقل من صحة الجندي الذي خلفه، لذا يحتفظ الأصل بقيمة maxHealth، أي الصحة التي يبدأ بها جندي المشاة، وينسخها كل عدو إلى حقل خاص به. وتقسم لعبة سباق السيارات بيانات السيارة بالطريقة نفسها:
[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
public float topSpeed = 30f;
public float tankSize = 50f;
}
public class Car : MonoBehaviour
{
public CarData data;
private float fuel;
void Awake()
{
fuel = data.tankSize;
}
}تشترك كل السيارات من طراز واحد في CarData واحد، وتستهلك كل منها fuel الخاص بها. أما كتابة data.tankSize -= used فستستنزف خزان كل سيارة من ذلك الطراز دفعة واحدة، وفي المحرر سيبقى التغيير في الأصل بعد Play. تعمل Awake فور إنشاء الكائن، لذا تكون النسخة جاهزة قبل أن يتمكن أي شيء من استخدامها.
التحدي
سهلينضم Runner إلى Grunt: أسرع، وبصحة أقل. أنشئ أصلًا خاصًا لكل نوع.
- في
EnemyData.cs، اجعل إنشاء EnemyData ممكنًا من قائمة Create، باستخدام اسم القائمةTower Defense/Enemy Data، وأضف إليه الحقول العامةspeed(من النوع float) وmaxHealthوreward(من النوع int). - في
Enemy.cs، استبدل الحقلspeedبحقل عامdataمن النوع EnemyData، واجعل الحركة بسرعةdata.speed. - أضف متغير int خاصًا
health، واجعل قيمته مساوية لـmaxHealthفي الأصل ضمنAwake.
يحتوي المشروع على أصل GruntData (السرعة 2، الصحة 9، المكافأة 5) وأصل RunnerData (السرعة 3.5، الصحة 5، المكافأة 3)، ويُعيّن Inspector أصلًا لكل عدو. اضغط Play وشاهد Runner وهو يتجاوز Grunt، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
// يأتي لاحقًا: إحصائيات نوع واحد من الأعداء، بوصفها أصلًا.
public class EnemyData : ScriptableObject
{
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.