Menu
CoddyTech

מתודות הרחבה

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 33 מתוך 50.

Vector3 ו-Transform שייכים ל-Unity, ולכן אי אפשר להוסיף להם מתודה. מתודת הרחבה היא מתודה סטטית ש-C# מאפשרת לקרוא לה כאילו היא שייכת להם. שתי המתודות האלה חוסכות שורות שמופיעות בכל פרויקט:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// בכל סקריפט
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

יש שלושה דברים שהופכים מתודה למתודת הרחבה: מחלקה סטטית שאינה מקוננת או גנרית, מתודה סטטית, ו-this לפני הפרמטר הראשון. הפרמטר הזה הוא הערך שמשמאל לנקודה, ולכן transform.position.WithY(0.5f) מתקמפל ל-UnityExtensions.WithY(transform.position, 0.5f). Vector3 הוא מבנה, ולכן v הוא עותק: WithY לא יכולה לשנות את הווקטור של הקוד הקורא, ובמקום זאת מחזירה וקטור חדש. כך גם עוקפים את transform.position.y = 0.5f;, שלא מתקמפל.

המחלקה הסטטית אינה MonoBehaviour. היא נמצאת בקובץ .cs משלה, כל שם יתאים, והיא לעולם לא מתווספת לאובייקט. מתודות שיורשות מ-MonoBehaviour, כגון Destroy, צריכות לקבל כאן את שם המחלקה שלהן: Object.Destroy. בטוח להשמיד ילדים בתוך ה-foreach, כי Unity מסירה אותם רק בסוף הפריים.

challenge icon

אתגר

בינוני

ינשוף על עמוד גבוה משגיח על החצר. החצים מזיזים את ה-Player (מוכן). הוסיפו לפרויקט שתי מתודות הרחבה והשתמשו בהן עבור הינשוף:

  • ב-FlatExtensions.cs, כתבו מחלקה סטטית FlatExtensions.
  • FlatDistance מרחיבה את Vector3: a.FlatDistance(b) מחזירה את המרחק מ-a אל b לאורך הקרקע, בלי להביא בחשבון את הפרש הגובה. מ-(0, 5, 0) אל (3, 0, 4) המרחק הוא 5.
  • FaceFlat מרחיבה את Transform: t.FaceFlat(target) מסובבת את t כך שיפנה אל המטרה סביב y בלבד, ולכן הוא נשאר זקוף בלי קשר לגובה המטרה.
  • ב-Owl.cs, בכל פריים הינשוף פונה אל השחקן באמצעות FaceFlat, וה-eyes שלו דולקות כשהשחקן קרוב יותר מ-sight (3) לאורך הקרקע, וכבויות אחרת. הינשוף יושב גבוה על העמוד שלו, ולכן אין להשתמש ב-Vector3.Distance.

לחצו על הפעלה, הסתובבו סביב העמוד ועברו מתחת לינשוף, ואז לחצו על בדיקה.

נסו בעצמכם

using UnityEngine;

// FlatExtensions: FlatDistance ו-FaceFlat
quiz iconבחנו את עצמכם

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

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