Menu
CoddyTech

A Loja

Lição 15 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.

Com duas torres, o jogador precisa de uma loja. Ela é montada a partir dos dados: para cada prefab de torre, um botão mostra o nome e o preço, e um clique escolhe essa torre para a próxima plataforma. O ShopPanel na parte inferior contém os dois botões.

Os botões criados em um loop recebem seus listeners ali, com uma lambda. Uma lambda captura variáveis, não seus valores, e um loop for tem um único i para todas as suas iterações: se clicadas depois, todas as lambdas leem i depois que o loop já passou do fim. Uma variável local declarada dentro do loop é nova a cada iteração, então copie o valor para ela primeiro:

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

Desafio

Médio

Adicione uma loja onde um clique escolhe a torre para construir.

  1. Em BuildManager, substitua towerPrefab por Tower[] shop, Button[] shopButtons e Color chosenColor serializados, e adicione private Tower chosen;.
  2. Em Start, rotule cada botão com prefab.data.towerName + "\n" + prefab.data.cost e faça um clique chamar Choose(prefab); depois, Choose(shop[0]).
  3. Choose mantém a torre selecionada e colore seu botão com chosenColor, deixando os outros brancos. Construa chosen pelo custo de chosen.data.cost.

Pressione “Jogar” e construa os dois tipos. Depois, pressione “Verificar”.

Experimente você mesmo

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

Todas as lições de Jogo de Unity: Defesa de Torres

Pratique por conta própria: Playground de Unity