Menu
CoddyTech

Sklep

Lekcja 15 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.

Przy dwóch wieżach gracz potrzebuje sklepu. Tworzy się on na podstawie danych: dla każdego prefabrykatu wieży przycisk wyświetla nazwę i cenę, a kliknięcie wybiera tę wieżę dla następnego pola. Panel sklepu u dołu zawiera dwa przyciski.

Przyciski utworzone w pętli otrzymują w niej swoje odbiorniki za pomocą lambdy. Lambda przechwytuje zmienne, a nie ich wartości, a pętla for ma jedno i dla wszystkich swoich iteracji: jeśli klikniesz później, każda lambda odczyta i po tym, jak pętla przekroczyła koniec. Zmienna lokalna zadeklarowana wewnątrz pętli jest nowa w każdej iteracji, więc najpierw skopiuj do niej wartość:

for (int i = 0; i < levels.Length; i++)
{
    LevelData level = levels[i];
    levelButtons[i].onClick.AddListener(() => Load(level));
}
challenge icon

Wyzwanie

Średni

Dodaj sklep, w którym kliknięcie wybiera wieżę do zbudowania.

  1. W BuildManager zastąp towerPrefab serializowanymi polami Tower[] shop, Button[] shopButtons i Color chosenColor, a także dodaj private Tower chosen;.
  2. W Start ustaw etykietę każdego przycisku na prefab.data.towerName + "\n" + prefab.data.cost i spraw, aby kliknięcie wywoływało Choose(prefab); następnie wywołaj Choose(shop[0]).
  3. Choose zachowuje wybraną wieżę i nadaje kolor jej przyciskowi: chosenColor, a pozostałym biały. Buduj chosen za chosen.data.cost.

Naciśnij „Graj” i zbuduj oba rodzaje wież. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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);
    }
}

Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży

Poćwicz samodzielnie: Edytor online Unity