Menu
CoddyTech

בחירת מגדל

שיעור 17 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.

לחיצה על מגדל פותחת חלונית שמציגה את הרמה שלו ואת מה שהרמה הבאה תביא. לחיצה על מגדל פוגעת באחד החלקים שלו, בבסיס או בראש, שהם ילדים של המגדל, ולכן hit.collider.GetComponentInParent<Tower>() מוצאת את המגדל שהם שייכים אליו: היא בודקת את האובייקט שנפגע, ואז עולה דרך האובייקטים ההורים שלו.

החלונית מציגה את הנתונים הסטטיסטיים עכשיו וברמה הבאה זה לצד זה, כדי שהשחקן יראה מה השדרוג מעניק:

towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);
challenge icon

אתגר

בינוני

לחצו על מגדל כדי לפתוח את החלונית שלו.

  1. ב־BuildManager, הוסיפו private Tower selected;. לחיצה על מגדל בוחרת אותו; לחיצה על כל דבר אחר אינה בוחרת דבר.
  2. הוסיפו את towerPanel (אובייקט GameObject) ואת towerNameText, towerStatsText, upgradeLabel (מסוג TMP_Text) עם Serialize. החלונית מוצגת רק כשנבחר מגדל.
  3. מלאו אותה: Arrow level 1, Damage 2 > 3 ו־Range 4.5 > 5 בשתי שורות, Upgrade 40.

לחצו על שחק, בנו מגדל ולחצו עליו. לאחר מכן לחצו על בדיקה.

נסו בעצמכם

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower[] shop;
    [SerializeField] private Button[] shopButtons;
    [SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);

    private Tower chosen;

    void Start()
    {
        for (int i = 0; i < shop.Length; i++)
        {
            Tower prefab = shop[i];
            shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
            shopButtons[i].onClick.AddListener(() => Choose(prefab));
        }
        Choose(shop[0]);
    }

    void Choose(Tower prefab)
    {
        chosen = prefab;
        for (int i = 0; i < shop.Length; i++)
        {
            shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
        }
    }

    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(chosen.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(chosen, pad.transform.position, Quaternion.identity);
    }
}

כל השיעורים ביחידה משחק Unity: הגנת מגדלים

תרגלו בעצמכם: Unity אונליין