الموجات
الدرس 4 من 18 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
تأتي الأعداء على شكل موجات: مجموعة من نوع واحد، موزعة على طول المسار، ثم استراحة قبل المجموعة التالية. تتكون الموجة من بضعة أرقام، لذا فهي فئة [System.Serializable]، ويحتفظ مولّد الموجات بـ List<Wave> التي يعرضها Inspector على شكل صفوف لملئها. من دون [System.Serializable] لا يستطيع Unity حفظ Wave، ولا يعرض Inspector القائمة، فتبقى فارغة.
التوقيت عبارة عن روتين مشترك: حلقة تُنشئ العناصر، ثم تنفّذ new WaitForSeconds(...) للانتظار من دون إيقاف بقية اللعبة. ويعمل عرض الألعاب النارية بالطريقة نفسها عبر دفعات إطلاقه، مع استراحة بعد كل دفعة:
IEnumerator Show()
{
foreach (Salvo salvo in salvos)
{
for (int i = 0; i < salvo.rockets; i++)
{
Instantiate(rocketPrefab, launcher.position, Quaternion.identity);
yield return new WaitForSeconds(salvo.gap);
}
yield return new WaitForSeconds(pause);
}
}الأعداء الآن قوالب جاهزة. لا يمكن لحقول القالب أن تشير إلا إلى الأصول والكائنات الموجودة داخل القالب، لذا تكون مصفوفة waypoints للعدو الجديد فارغة. يمتلك مولّد الموجات المسار ويمرره إلى كل عدو مباشرةً بعد Instantiate. تُرجع Instantiate النوع الذي أُعطي لها، لذا إذا كان نوع حقل القالب Enemy، فإنها تُرجع Enemy الجديد، جاهزًا لضبطه.
التحدي
سهلأصبح Grunt وRunner الآن عنصرين جاهزين (prefabs)، وانضم إليهما Tank وBoss ولكلٍ منهما EnemyData خاص به. يقع الكائن Spawner عند WP0. أرسل الأعداء على شكل موجات:
- في
Wave.cs، اجعل Wave صنفًا قابلًا للتسلسل، يحتوي على الحقول العامةenemy(من نوع Enemy: العنصر الجاهز)، وcount(من نوع int)، وspacing(من نوع float، ويمثل عدد الثواني بين عدوين). - في
WaveSpawner، أضف ثلاثة حقول خاصة متسلسلة:waves(من نوعList<Wave>)، وwaypoints(مصفوفة Transform)، وtimeBetweenWaves(من نوع float). - من
Start، شغّل روتينًا مشتركًا يمر على الموجات بالترتيب. لكل موجة: انتظرtimeBetweenWaves، وسجّل رقم الموجة بدءًا من 1، مثلWave 1، ثم أرسل أعداءها وعددهمcountعند أول نقطة مسار، وعيّن لكل واحد منهمwaypoints، وانتظرspacingبعد كل عدو. - بعد الموجة الأخيرة، سجّل
All waves sent.
يملأ Inspector موجات اللعبة الثماني وفترة استراحة مدتها 8 ثوانٍ. اضغط Play وشاهد الموجات الأولى وهي تصل، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
// يأتي لاحقًا: يرسل الأعداء على طول المسار في موجات.
public class WaveSpawner : MonoBehaviour
{
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.