מתודות הרחבה
חלק מהיחידה ארכיטקטורת משחקים ב-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 מסירה אותם רק בסוף הפריים.
אתגר
בינוניינשוף על עמוד גבוה משגיח על החצר. החצים מזיזים את ה-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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיס לאויברכיבים מופשטיםרכיבים שעובדים יחדסיכום: צריח מודולרי