ביטויי למבדה
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 7 מתוך 56.
AddListener מקבלת מתודה ללא פרמטרים. כדי שלחיצה תקרא ל־Paint(Color.red), שמקבלת צבע, כתבו את המתודה במקום: () => Paint(Color.red). זוהי למבדה, מתודה ללא שם. הסוגריים () מכילים את הפרמטרים שלה — אין כאלה כאן — ואחרי => מופיע הגוף שלה: פקודה אחת, או בלוק בתוך { } למספר פקודות:
public Button redButton;
public Button blueButton;
public Button resetButton;
public Renderer lamp;
private int changes;
void Start()
{
redButton.onClick.AddListener(() => Paint(Color.red));
blueButton.onClick.AddListener(() => Paint(Color.blue));
resetButton.onClick.AddListener(() =>
{
changes = 0;
lamp.material.color = Color.white;
});
}
void Paint(Color color)
{
lamp.material.color = color;
changes++;
}מתודת Paint אחת משמשת את שני כפתורי הצבע, וכל למבדה מעבירה צבע משלה. למבדה לוכדת את המשתנים שבהם היא משתמשת: היא לא מעתיקה את הערכים שלהם, אלא קוראת אותם כשהיא רצה. למבדת האיפוס מגדירה את השדה changes בכל לחיצה, זמן רב אחרי ש־Start() הסתיימה.
זה עלול לתפוס אתכם בלולאה. עם swatches[i].onClick.AddListener(() => Paint(colors[i])); כל הלמבדות לוכדות את אותו i, ועד שמישהו לוחץ, הלולאה הסתיימה ו־i שווה ל־colors.Length: כל דוגמית צבע גורמת ל־IndexOutOfRangeException. משתנה שמוצהר בתוך הלולאה הוא משתנה חדש בכל איטרציה, לכן העתיקו אליו את i ולכדו את העותק:
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}אתגר
קלהכספת נפתחת באמצעות קוד בן שלוש ספרות. ב־Keypad.cs כבר קיימת הפונקציה Press(int digit), שמוסיפה ספרה לקוד שמופיע על המסך, ולאחר שלוש ספרות פותחת את הדלת או מציגה את Wrong, וגם הפונקציה ShowCode(), שמציגה את מה שהוקלד עד כה. חברו את הכפתורים בתוך Start():
- ב־
keysנמצאים ארבעת כפתורי הספרות לפי הסדר:keys[0]מקליד 1,keys[1]מקליד 2,keys[2]מקליד 3 ו־keys[3]מקליד 4. חברו אותם בלולאתfor, כשכל אחד מהם משתמש בביטוי lambda שקורא ל־Press. clearButton, עם ביטוי lambda אחד, מוחק את הקוד שהוקלד עד כה (entered) ומציג אותו באמצעותShowCode().
הקוד הוא 312. לחצו על Play, פתחו את הכספת, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Keypad : MonoBehaviour
{
public Button[] keys;
public Button clearButton;
public TMP_Text codeText;
public GameObject door;
public string secret = "312";
private string entered = "";
void Start()
{
ShowCode();
// חברו כל מקש ל-Press עם הספרה שלו, ואת clearButton לניקוי הקוד
}
void Press(int digit)
{
entered += digit;
ShowCode();
if (entered.Length == 3)
{
if (entered == secret)
{
door.SetActive(false);
codeText.text = "Open";
}
else
{
codeText.text = "Wrong";
}
entered = "";
}
}
void ShowCode()
{
codeText.text = "Code: " + entered;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות