Menu
CoddyTech
flag Ar iconالعربيةdown icon

الموجات كبيانات

جزء من قسم هندسة الألعاب في 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 ذي موجات أصعب، ويبقى السكربت كما هو.

challenge icon

التحدي

متوسط

مطر الكتل: تسقط الكتل من السماء على إيقاع، وعليك تفاديها باستخدام الأسهم. يُسقط 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 (الأصل)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity