Menu
CoddyTech

גלים כנתונים

חלק מהיחידה ארכיטקטורת משחקים ב-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; כפתור + מוסיף גל. מחולל הגלים עובר על הרשימה בתוך קורוטינה:

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 שניות, ולאחריהם 2 בריונים, החיילים הפשוטים מגיעים בשניות 0, 0.5 ו-1, אחר כך מגיעים ההמתנה שלאחר החייל הפשוט האחרון ופרק המנוחה של 3 שניות, והבריונים הראשונים מגיעים אחרי 4.5 שניות. המחולל של Level 2 מקבל נכס Level2 עם גלים קשים יותר, והסקריפט נשאר ללא שינוי.

challenge icon

אתגר

בינוני

Block Rain: בלוקים נופלים מהשמיים לפי קצב, ואתם מתחמקים מהם באמצעות החצים. ה־Dropper מפיל בלוק בכל נתיב במערך lanes שלו, תמיד בהפרש של שנייה אחת. הפכו את הקצב לנתונים, כדי שכל שיר יוכל להיות נכס:

  • ב־DropPattern.cs, כתבו מחלקה [System.Serializable] בשם Drop עם השדות הציבוריים lane (מסוג int: ‏-1 לשמאל, 0 לאמצע, 1 לימין) ו־delay (מסוג float: מספר השניות שיש להמתין לפני ההפלה הזו). מתחתיה, כתבו את DropPattern, שהוא ScriptableObject עם [CreateAssetMenu] והשדות הציבוריים blockPrefab (מסוג GameObject), ‏laneWidth (מסוג float) ו־drops (מסוג List<Drop>).
  • ב־Dropper, החליפו את שני השדות בשדה ציבורי pattern מסוג DropPattern. עבור כל הפלה לפי הסדר, המתינו למשך delay שלה, ואז הפילו את הבלוק של התבנית במיקום של ה־Dropper, כשהוא מוזז לאורך ציר x במרחק של lane כפול laneWidth. אחרי ההפלה האחרונה, כתבו ביומן Pattern done.

בפרויקט יש נכס בשם Song1: רוחב הנתיב הוא 2 ויש בו ארבע הפלות, וה־Inspector מציב אותו בשדה pattern של ה־Dropper. לחצו על הפעלה והתחמקו, ואז לחצו על בדיקה.

נסו בעצמכם

using System.Collections.Generic;
using UnityEngine;

// כאן נמצאים Drop (בלוק אחד: המסלול שלו וזמן ההמתנה לפניו) ו-DropPattern (הנכס)
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity