Menu
CoddyTech

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

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

challenge icon

אתגר

בינוני

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

  1. ב־Helpers.cs, כתבו את המחלקה הסטטית Helpers עם הפונקציה הציבורית InRange<T>(IEnumerable<T> items, Vector3 center, float range) עבור רכיבים: רשימה מסוג List<T> של הפריטים שנמצאים במרחק של לכל היותר range.
  2. ב־Pulse, בלחיצה על Space, תנו לכל Rigidbody שבטווח דחיפה כלפי מעלה בעוצמה של lift.
  3. לאחר מכן, קראו ל־TurnOn() עבור כל Lamp שבטווח.

לחצו על "שחק" ואז לחצו על Space: הארגז הקרוב יקפוץ. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: הפריטים בטווח של נקודה

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

תרגלו בעצמכם: Unity אונליין