פונקציות עזר גנריות
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 44 מתוך 64.
כמה פונקציות עזר זהות לכל סוג: לקבל רכיב או להוסיף אותו, לבחור איבר אקראי מתוך מערך. מתודה גנרית מגדירה אותן פעם אחת, כשהסוג הוא פרמטר 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: היא פועלת באותה מידה עם צבעים, מחרוזות וקדם-תבניות. לעיתים רחוקות צריך לכתוב את הסוג בקריאה: מתוך colors, שהוא מערך מסוג Color[], המהדר מסיק ש-T הוא Color. מתודה שמקבלת IEnumerable<T> במקום T[] מקבלת גם מערכים וגם רשימות מסוג List, כולל המערכים ש-FindObjectsByType<T> מחזירה.
אתגר
בינוניכתבו פונקציית עזר גנרית אחת עבור הארגזים והמנורות של מגדל ההלם.
- ב־
Helpers.cs, כתבו את המחלקה הסטטיתHelpersעם הפונקציה הציבוריתInRange<T>(IEnumerable<T> items, Vector3 center, float range)עבור רכיבים: רשימה מסוגList<T>של הפריטים שנמצאים במרחק של לכל היותרrange. - ב־
Pulse, בלחיצה על Space, תנו לכל Rigidbody שבטווח דחיפה כלפי מעלה בעוצמה שלlift. - לאחר מכן, קראו ל־
TurnOn()עבור כל Lamp שבטווח.
לחצו על "שחק" ואז לחצו על Space: הארגז הקרוב יקפוץ. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: הפריטים בטווח של נקודה
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין