الموجات كبيانات
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 22 من 50.
موجات المستوى هي قائمة: ثلاثة جنود مشاة، ثم جنديان قويان، ثم زعيم. إذا كُتبت في شيفرة مولّد الموجات، فسيحتاج كل مستوى إلى شيفرته الخاصة. أما إذا كُتبت كبيانات، فتُوضع القائمة في أصل، أصل واحد لكل مستوى، ويقرأ سكربت واحد لمولّد الموجات الأصل الذي يُعطى له. كل مدخلة هي صنف [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؛ ويضيف الزر + موجة. يتنقّل مولّد الموجات عبر القائمة باستخدام coroutine:
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 ثانية. يحصل مولّد الموجات في Level 2 على أصل Level2 ذي موجات أصعب، ويبقى السكربت كما هو.
التحدي
متوسطمطر الكتل: تسقط الكتل من السماء على إيقاع، وعليك تفاديها باستخدام الأسهم. يُسقط Dropper كتلةً في كل مسار من مصفوفة lanes الخاصة به، بفاصل ثانية واحدة دائمًا. حوّل الإيقاع إلى بيانات، بحيث يمكن أن تكون كل أغنية أصلًا:
- في
DropPattern.cs، اكتب فئة[System.Serializable]باسمDrop، تتضمن الحقلين العامينlane(عددًا صحيحًا: -1 لليسار، و0 للوسط، و1 لليمين) وdelay(عددًا عشريًا: عدد الثواني التي يجب انتظارها قبل هذا الإسقاط). أسفلها، اكتبDropPattern، وهو ScriptableObject يتضمن[CreateAssetMenu]والحقول العامةblockPrefab(وهو GameObject)، وlaneWidth(عدد عشري)، وdrops(قائمة من النوعList<Drop>). - في
Dropper، استبدل كلا الحقلين بحقل عامpatternمن النوع DropPattern. لكل إسقاط بالترتيب، انتظر مدةdelayالخاصة به، ثم أسقط كتلة النمط عند موضع Dropper بعد إزاحته على محور x بمقدارlaneمضروبًا فيlaneWidth. بعد آخر إسقاط، سجّلPattern done.
يحتوي المشروع على أصل Song1: عرض المسار 2 وأربعة إسقاطات، ويضعه Inspector في حقل pattern الخاص بـ Dropper. اضغط Play وتفادَ الكتل، ثم اضغط Check.
جرّب بنفسك
using System.Collections.Generic;
using UnityEngine;
// يوضع هنا Drop (كتلة واحدة: المسار الذي تسلكه ومدة الانتظار قبلها) وDropPattern (الأصل)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء5ScriptableObjects
أصول البياناتإحصاءات الأسلحةالإعدادات المشتركةالموجات كبياناتمراجعة: قاعدة بيانات العناصر