החנות
שיעור 15 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.
עם שני מגדלים, השחקן צריך חנות. היא נבנית מתוך נתונים: עבור כל קדם־מופע של מגדל, כפתור מציג את השם ואת המחיר, ולחיצה בוחרת את המגדל הזה עבור המשטח הבא. ShopPanel בתחתית מכיל את שני הכפתורים.
מוסיפים לכפתורים שנוצרים בלולאה מאזינים שם, באמצעות למבדה. למבדה לוכדת משתנים, לא את הערכים שלהם, וללולאת for יש i אחד לכל האיטרציות שלה: אם לוחצים מאוחר יותר, כל למבדה קוראת את i לאחר שהלולאה כבר עברה את הסוף. משתנה מקומי שמוגדר בתוך הלולאה הוא חדש בכל איטרציה, לכן צריך להעתיק אליו תחילה:
for (int i = 0; i < levels.Length; i++)
{
LevelData level = levels[i];
levelButtons[i].onClick.AddListener(() => Load(level));
}אתגר
בינוניהוסף חנות שבה לחיצה בוחרת את המגדל לבנייה.
- ב־
BuildManager, החלף אתtowerPrefabב־Tower[] shop, ב־Button[] shopButtonsוב־Color chosenColorמסודרים בסריאליזציה, והוסףprivate Tower chosen;. - ב־
Start, הצג בכל כפתור אתprefab.data.towerName + "\n" + prefab.data.costוהגדר שלחיצה תקרא ל־Choose(prefab); לאחר מכן קרא ל־Choose(shop[0]). Chooseשומר את המגדל שנבחר וצובע את הכפתור שלו ב־chosenColor, ואת האחרים בלבן. בנה אתchosenבמחירchosen.data.cost.
לחץ על שחק ובנה מגדלים משני הסוגים. לאחר מכן לחץ על בדיקה.
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class BuildManager : MonoBehaviour
{
[SerializeField] private GameManager game;
[SerializeField] private Tower towerPrefab;
void Update()
{
if (!Mouse.current.leftButton.wasPressedThisFrame)
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out BuildPad pad))
{
Build(pad);
}
}
void Build(BuildPad pad)
{
if (pad.tower != null)
{
return;
}
if (!game.TrySpend(towerPrefab.data.cost))
{
Debug.Log("Not enough money");
return;
}
pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
}
}
כל השיעורים ביחידה משחק Unity: הגנת מגדלים
תרגלו בעצמכם: Unity אונליין