Pertahanan Menara Ringan
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 61 dari 64.
Creep berbaris di sepanjang jalan menuju markasmu, dan satu tower menjaganya. Tower menembakkan peluru ke creep terdekat selama ada creep dalam jangkauan, dan setiap creep yang dikalahkannya memberikan emas. Tekan Spasi untuk membelanjakan emas guna membeli level tower berikutnya: setiap level memiliki jangkauan lebih jauh, menembak lebih cepat, atau menghasilkan kerusakan lebih besar. Creep yang mencapai markas akan lolos. Level-level ini adalah data game yang dapat diatur desainer di sebuah aset tanpa menyentuh kode. Tower menembakkan banyak peluru, jadi tower menggunakan kembali peluru dari sebuah pool, bukan membuat dan menghancurkan satu peluru untuk setiap tembakan.
Tulis dua skrip: TowerData, tipe aset, dan Tower. Creep, Bolt, dan CreepSpawner sudah siap, begitu juga Nearest dan Show milik tower.
Tantangan
SulitSelesaikan menara; Nearest(range) dan Show() sudah siap.
TowerLevel: dapat diserialisasi, denganrange,fireEvery,damage,costpublik.TowerDatamenyimpanpublic List<TowerLevel> levels.- Setiap
fireEverydetik, jikaNearest(range)menemukan creep, tempatkan bolt dariObjectPool<Bolt>di menara:bolt.Launch(creep, damage, pool.Release). Show()setelahCreep.Killedmemberikanbountydan setelah tombol Spasi membeli level berikutnya sehargacost-nya, catatTower level 2.
Tekan tombol “Main” dan tingkatkan level. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;
public class Tower : MonoBehaviour
{
[SerializeField] private TowerData data;
[SerializeField] private Bolt boltPrefab;
[SerializeField] private TMP_Text infoText;
private int level;
private int gold;
// Siap: creep terdekat dari menara dalam jangkauan, atau null.
Creep Nearest(float range)
{
Creep nearest = null;
float best = Mathf.Infinity;
foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
{
if (hit.TryGetComponent(out Creep creep))
{
float distance = Vector3.Distance(transform.position, creep.transform.position);
if (distance < best)
{
best = distance;
nearest = creep;
}
}
}
return nearest;
}
// Siap: menampilkan level dan gold, seperti Level 1, 0 gold.
void Show()
{
infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity