רכיבים שפועלים יחד
חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 4 מתוך 64.
גם רכיבים קטנים עדיין זקוקים זה לזה. ג׳טפק זקוק לדלק באותו אובייקט, ולכן הוא מוצא את הדלק פעם אחת ב-Awake, שומר אותו בשדה וניגש אליו באמצעות שתי מתודות ציבוריות קטנות:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] גורם ל-Unity להוסיף רכיב Fuel בכל פעם שמוסיפים Jetpack, בעורך או באמצעות AddComponent, ומונע את הסרת רכיב Fuel כל עוד ה-Jetpack נמצא שם. Unity בודקת זאת רק ברגע הוספת ה-Jetpack, לכן Jetpack שכבר היה באובייקט לפני שכתבת את המאפיין שומר על ההגדרה הקודמת שלו. המקום הנכון לשלוף אותו הוא Awake: היא מופעלת פעם אחת, ועד אז כל הרכיבים של האובייקט כבר נמצאים שם.
ה-Jetpack לעולם לא משנה את amount בעצמו. רכיב Fuel קובע מה המשמעות של שריפת דלק, למשל שלא לרדת מתחת ל-0, וה-Jetpack רק מבקש. אם בהמשך Fuel יציג מד דלק או יתמלא מפריטים לאיסוף, ה-Jetpack לא יצטרך להשתנות.
אתגר
קלגרמו לכך שהזינוק של המחליק יעלה בסיבולת.
- ב־
Stamina, הוסיפו אתpublic bool TrySpend(float cost): אםcurrentגדול או שווה ל־cost, הפחיתו את הערך הזה והחזירוtrue, אחרת החזירוfalse. - הוסיפו את
[RequireComponent(typeof(Stamina))]מעלpublic class Dash, ושלפו את הרכיב אל שדה בתוךAwake(). - בלחיצה על מקש הרווח, בצעו זינוק רק אם
TrySpend(cost)מחזירהtrue; אחרת, רשמוToo tiredביומן.
לחצו על "שחק": אחרי שני זינוקים, במסוף יופיע Too tired. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity
1רכיבים, לא היררכיות
רכיבים קטניםסקריפט בסיסי לאויברכיבים מופשטיםרכיבים שפועלים יחדחזרה: צריח מודולריחזרה: תותח כפול4נתונים שעברו סריאליזציה
מחלקות שניתנות לסריאליזציהרשימות ב־Inspectorטיפוסי Enum ב־Inspectorחזרה: טבלת שללהגרלת השלל2ממשקים ב-Unity
IDamageableממשקים ו-TryGetComponentGetComponentsסיכום: מקש אינטראקציהסיכום: הקרוב ביותר בטווחתרגלו בעצמכם: Unity אונליין