الموجات كبيانات
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 27 من 64.
تكون موجات المستوى قائمةً: ثلاثة جنود مشاة، ثم مقاتلان قويان، ثم زعيم. إذا كُتبت في شيفرة مُولِّد الأعداء، فسيحتاج كل مستوى إلى شيفرته الخاصة. أما إذا كُتبت على هيئة بيانات، فتُوضَع القائمة في أصل، أصل واحد لكل مستوى، ويقرأ سكريبت مُولِّد الأعداء الأصل الذي يُمرَّر إليه. كل عنصر هو فئة [System.Serializable]، لذا يعرض Inspector الخاص بالأصل القائمة:
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Wave
{
public GameObject enemy;
public int count = 1;
public float spacing = 1f;
}
[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
public List<Wave> waves;
public float restBetweenWaves = 3f;
}هذا كله في ملف واحد، WaveSet.cs: يحتاج ScriptableObject إلى ملف يحمل اسمه، ويمكن أن تكون الفئة العادية Wave إلى جانبه. اختر أصل WaveSet، وسيعرض Inspector موجات Waves مع حجمها Size والصفين Element 0 وElement 1، ويحتوي كل منهما على Enemy وCount وSpacing؛ يضيف زر + موجةً. يتنقّل مُولِّد الأعداء عبر القائمة داخل روتين مشترك:
public class WaveSpawner : MonoBehaviour
{
public WaveSet waveSet;
void Start()
{
StartCoroutine(SendWaves());
}
IEnumerator SendWaves()
{
foreach (Wave wave in waveSet.waves)
{
for (int i = 0; i < wave.count; i++)
{
Instantiate(wave.enemy, transform.position, Quaternion.identity);
yield return new WaitForSeconds(wave.spacing);
}
yield return new WaitForSeconds(waveSet.restBetweenWaves);
}
Debug.Log("Last wave sent");
}
}عندما يحتوي Level1 على 3 جنود مشاة يفصل بين كلٍّ منهم 0.5 ثانية، ثم مقاتلين قويين، يظهر جنود المشاة عند 0 و0.5 و1 ثانية، ثم تأتي الفترة الفاصلة بعد آخر جندي مشاة وفترة الراحة البالغة 3 ثوانٍ، ويظهر أول مقاتل قوي عند 4.5 ثانية. يحصل مُولِّد الأعداء في المستوى 2 على أصل Level2 ذي موجات أصعب، ويبقى السكريبت كما هو.
التحدي
متوسطحوّل إيقاع Dropper إلى أصل أغنية.
- في
DropPattern.cs، اكتب فئةDropمع[System.Serializable]، وتضمint laneوfloat delayعامّين. - أسفلها، اكتب
DropPattern : ScriptableObjectمع[CreateAssetMenu]وGameObject blockPrefabوfloat laneWidthوList<Drop> dropsعامّة. - في
Dropper، استخدمpublic DropPattern pattern;: انتظرdrop.delayلكل كتلة، ثم أسقط الكتلة بعد تحريكها بمقدارdrop.lane * pattern.laneWidthعلى محور x.
اضغط «العب»: تسقط أربع كتل. ثم اضغط «تحقق».
جرّب بنفسك
using System.Collections.Generic;
using UnityEngine;
// يوضع هنا Drop (كتلة واحدة: مسارها ومدة الانتظار قبلها) وDropPattern (الأصل)
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاق5ScriptableObjects
أصول البياناتإحصاءات الأسلحةالإعدادات المشتركةأنقذ الرياحالموجات كبياناتمراجعة: قاعدة بيانات العناصرمراجعة: الشراء من المتجرتدرّب بنفسك: Playground لـ Unity