בחירת מגדל
שיעור 17 מתוך 25 בקורס משחק Unity: הגנת מגדלים של Coddy.
לחיצה על מגדל פותחת חלונית שמציגה את הרמה שלו ואת מה שהרמה הבאה תביא. לחיצה על מגדל פוגעת באחד החלקים שלו, בבסיס או בראש, שהם ילדים של המגדל, ולכן hit.collider.GetComponentInParent<Tower>() מוצאת את המגדל שהם שייכים אליו: היא בודקת את האובייקט שנפגע, ואז עולה דרך האובייקטים ההורים שלו.
החלונית מציגה את הנתונים הסטטיסטיים עכשיו וברמה הבאה זה לצד זה, כדי שהשחקן יראה מה השדרוג מעניק:
towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);אתגר
בינונילחצו על מגדל כדי לפתוח את החלונית שלו.
- ב־
BuildManager, הוסיפוprivate Tower selected;. לחיצה על מגדל בוחרת אותו; לחיצה על כל דבר אחר אינה בוחרת דבר. - הוסיפו את
towerPanel(אובייקט GameObject) ואתtowerNameText,towerStatsText,upgradeLabel(מסוג TMP_Text) עם Serialize. החלונית מוצגת רק כשנבחר מגדל. - מלאו אותה:
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 אונליין