גלים כנתונים
חלק מהיחידה ארכיטקטורת משחקים ב-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 עם גלים קשים יותר, והסקריפט נשאר ללא שינוי.
אתגר
בינוני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 (הנכס)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי