Menu
CoddyTech

Магазин

Урок 15 из 25 курса Игра на Unity: Tower Defense на 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: Tower Defense

Потренируйтесь самостоятельно: Песочница Unity