Menu
CoddyTech

פונקציות עזר גנריות

חלק מהיחידה ארכיטקטורת משחקים ב-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>.

challenge icon

אתגר

בינוני

בשטח עומד מגדל הלם. כשלוחצים על 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>: הפריטים בטווח של נקודה
quiz iconבחנו את עצמכם

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

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