פונקציות עזר גנריות
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 35 מתוך 50.
כמה פונקציות עזר זהות לכל סוג: לקבל רכיב או להוסיף אותו, לבחור איבר אקראי מתוך מערך. מתודה גנרית מגדירה אותן פעם אחת, כאשר הסוג הוא פרמטר T שכל קריאה משלימה:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component הוא הבטחה לגבי T, והיא קובעת מה המתודה יכולה לעשות איתו. AddComponent מקבלת רק רכיבים, ולכן ללא האילוץ המהדר דוחה את go.AddComponent<T>(); עם האילוץ, כל רכיב מתאים, בין אם זה Rigidbody של Unity ובין אם אלה הסקריפטים שלך. האילוץ גם מאפשר לך לגשת לכל חבר של Component מתוך T, כגון .transform ו־.gameObject. אם לארגז כבר יש Rigidbody, הוא יקבל בחזרה את אותו רכיב, ולא יתווסף שום דבר.
ל־RandomItem אין אילוץ, כי היא אף פעם לא נוגעת ב־T: היא עובדת באותה מידה עם צבעים, מחרוזות ו־prefabs. בדרך כלל לא כותבים את הסוג בקריאה: מתוך colors, שהוא Color[], המהדר מסיק ש־T הוא Color. מתודה שמקבלת IEnumerable<T> במקום T[] מקבלת גם מערכים וגם Lists, כולל המערכים שמחזירה FindObjectsByType<T>.
אתגר
בינוניבשטח עומד מגדל הלם. כשלוחצים על Space, הוא שולח פעימה: ארגזים שנמצאים במרחק של עד 4 ממנו מוטחים כלפי מעלה, ומנורות שנמצאות במרחק של עד 4 נדלקות. Lamp.cs מוכן, עם TurnOn(). כתוב פונקציית עזר אחת שמוצאת את שניהם:
- בקובץ
Helpers.cs, כתוב מחלקה סטטית בשםHelpersעם מתודה גנריתInRange<T>(IEnumerable<T> items, Vector3 center, float range)לכל סוג רכיב. היא מחזירהList<T>של הפריטים שמיקומם נמצא במרחק שאינו עולה עלrangeמ-center. - בקובץ
Pulse.cs, כשלוחצים על Space: כל גוף מסוג Rigidbody בסצנה שנמצא במרחק של עדrangeמהמגדל מקבל דחיפה כלפי מעלה בעוצמהlift, וכל מנורה מסוג Lamp שנמצאת במרחק של עדrangeנדלקת. השתמש ב-InRange עבור שניהם, על המערכים שמתקבלים מ-FindObjectsByType.
לחץ על Play, לחץ על Space ואז לחץ על Check.
נסו בעצמכם
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: הפריטים בטווח של נקודה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי