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));
}Tantangan
SedangTambahkan toko agar satu klik memilih menara yang akan dibangun.
- Di
BuildManager, gantitowerPrefabdenganTower[] shop,Button[] shopButtons, danColor chosenColoryang diserialisasi, lalu tambahkanprivate Tower chosen;. - Di
Start, beri label setiap tombol denganprefab.data.towerName + "\n" + prefab.data.costdan buat klik memanggilChoose(prefab), lalu panggilChoose(shop[0]). Choosemenyimpan menaranya dan memberi warnachosenColorpada tombolnya, sedangkan tombol lainnya berwarna putih. Bangunchosendengan biayachosen.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