Menu
CoddyTech

החנות

שיעור 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));
}
challenge icon

אתגר

בינוני

הוסף חנות שבה לחיצה בוחרת את המגדל לבנייה.

  1. ב־BuildManager, החלף את towerPrefab ב־Tower[] shop, ב־Button[] shopButtons וב־Color chosenColor מסודרים בסריאליזציה, והוסף private Tower chosen;.
  2. ב־Start, הצג בכל כפתור את prefab.data.towerName + "\n" + prefab.data.cost והגדר שלחיצה תקרא ל־Choose(prefab); לאחר מכן קרא ל־Choose(shop[0]).
  3. 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 אונליין