Menu
CoddyTech

Gelombang sebagai Data

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 27 dari 64.

Gelombang suatu level adalah sebuah list: tiga grunt, lalu dua brute, lalu satu boss. Jika ditulis dalam kode spawner, setiap level memerlukan kodenya sendiri. Jika ditulis sebagai data, list tersebut dimasukkan ke dalam asset, satu asset untuk setiap level, dan satu skrip spawner membaca asset yang diberikan kepadanya. Setiap entri adalah class [System.Serializable], sehingga Inspector asset menampilkan list tersebut:

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Wave
{
    public GameObject enemy;
    public int count = 1;
    public float spacing = 1f;
}

[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
    public List<Wave> waves;
    public float restBetweenWaves = 3f;
}

Semua ini berada dalam satu file, WaveSet.cs: ScriptableObject memerlukan file dengan namanya sendiri, dan class Wave biasa bisa berada di sampingnya. Pilih asset WaveSet, lalu Inspector menampilkan Gelombang dengan Ukuran dan baris Elemen 0, Elemen 1, masing-masing dengan Musuh, Jumlah, dan Jarak; tombol + menambahkan gelombang. Spawner menelusuri list tersebut dalam sebuah coroutine:

public class WaveSpawner : MonoBehaviour
{
    public WaveSet waveSet;

    void Start()
    {
        StartCoroutine(SendWaves());
    }

    IEnumerator SendWaves()
    {
        foreach (Wave wave in waveSet.waves)
        {
            for (int i = 0; i < wave.count; i++)
            {
                Instantiate(wave.enemy, transform.position, Quaternion.identity);
                yield return new WaitForSeconds(wave.spacing);
            }
            yield return new WaitForSeconds(waveSet.restBetweenWaves);
        }
        Debug.Log("Last wave sent");
    }
}

Dengan Level1 yang berisi 3 grunt dengan jarak 0.5 detik, lalu 2 brute, grunt muncul pada detik ke-0, 0.5, dan 1. Setelah grunt terakhir, jeda antar kemunculan dan istirahat selama 3 detik berlangsung, lalu brute pertama muncul pada detik ke-4.5. Spawner Level 2 mendapat asset Level2 dengan gelombang yang lebih sulit, sementara skripnya tetap sama.

challenge icon

Tantangan

Sedang

Ubah ritme Dropper menjadi aset lagu.

  1. Di DropPattern.cs, tulis class Drop dengan atribut [System.Serializable], serta int lane dan float delay publik.
  2. Di bawahnya, tulis DropPattern : ScriptableObject dengan [CreateAssetMenu] serta GameObject blockPrefab, float laneWidth, dan List<Drop> drops publik.
  3. Di Dropper, gunakan public DropPattern pattern;: untuk setiap drop, tunggu selama drop.delay, lalu jatuhkan blok yang digeser sejauh drop.lane * pattern.laneWidth pada sumbu x.

Tekan tombol “Main”: empat blok jatuh. Lalu tekan tombol “Periksa”.

Coba sendiri

using System.Collections.Generic;
using UnityEngine;

// Drop (satu blok: jalurnya dan waktu tunggu sebelumnya) dan DropPattern (asetnya) ditempatkan di sini

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity