Menu
CoddyTech

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.

challenge icon

Tantangan

Sulit

Selesaikan menara; Nearest(range) dan Show() sudah siap.

  1. TowerLevel: dapat diserialisasi, dengan range, fireEvery, damage, cost publik. TowerData menyimpan public List<TowerLevel> levels.
  2. Setiap fireEvery detik, jika Nearest(range) menemukan creep, tempatkan bolt dari ObjectPool<Bolt> di menara: bolt.Launch(creep, damage, pool.Release).
  3. Show() setelah Creep.Killed memberikan bounty dan setelah tombol Spasi membeli level berikutnya seharga cost-nya, catat Tower 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

Latihan sendiri: Playground Unity