Menu
CoddyTech

Toko

Pelajaran 15 dari 25 dalam kursus Game Unity: Tower Defense di Coddy.

Dengan dua menara, pemain membutuhkan toko. Toko dibuat dari data: untuk setiap prefab menara, sebuah tombol menampilkan nama dan harganya, lalu klik memilih menara tersebut untuk alas berikutnya. ShopPanel di bagian bawah menampung kedua tombol.

Tombol yang dibuat dalam perulangan mendapatkan listener di sana, dengan lambda. Lambda menangkap variabel, bukan nilainya, dan perulangan for memiliki satu i untuk semua putarannya: jika diklik kemudian, setiap lambda membaca i setelah perulangan melewati akhir. Variabel lokal yang dideklarasikan di dalam perulangan adalah variabel baru pada setiap putaran, jadi salin nilainya ke variabel itu terlebih dahulu:

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

Tantangan

Sedang

Tambahkan toko agar satu klik memilih menara yang akan dibangun.

  1. Di BuildManager, ganti towerPrefab dengan Tower[] shop, Button[] shopButtons, dan Color chosenColor yang diserialisasi, lalu tambahkan private Tower chosen;.
  2. Di Start, beri label setiap tombol dengan prefab.data.towerName + "\n" + prefab.data.cost dan buat klik memanggil Choose(prefab), lalu panggil Choose(shop[0]).
  3. Choose menyimpan menaranya dan memberi warna chosenColor pada tombolnya, sedangkan tombol lainnya berwarna putih. Bangun chosen dengan biaya chosen.data.cost.

Tekan tombol “Main” dan bangun kedua jenis menara. Lalu tekan tombol “Periksa”.

Coba sendiri

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

Semua pelajaran di Game Unity: Tower Defense

Latihan sendiri: Playground Unity