Menu
CoddyTech

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

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

challenge icon

التحدي

متوسط

حوّل إيقاع Dropper إلى أصل أغنية.

  1. في DropPattern.cs، اكتب فئة Drop مع [System.Serializable]، وتضم int lane وfloat delay عامّين.
  2. أسفلها، اكتب DropPattern : ScriptableObject مع [CreateAssetMenu] وGameObject blockPrefab وfloat laneWidth وList<Drop> drops عامّة.
  3. في Dropper، استخدم public DropPattern pattern;: انتظر drop.delay لكل كتلة، ثم أسقط الكتلة بعد تحريكها بمقدار drop.lane * pattern.laneWidth على محور x.

اضغط «العب»: تسقط أربع كتل. ثم اضغط «تحقق».

جرّب بنفسك

using System.Collections.Generic;
using UnityEngine;

// يوضع هنا Drop (كتلة واحدة: مسارها ومدة الانتظار قبلها) وDropPattern (الأصل)

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

تدرّب بنفسك: Playground لـ Unity