Menu
CoddyTech

Sóng dưới dạng dữ liệu

Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 27 trên 64.

Các đợt quái của một màn chơi là một danh sách: ba lính quèn, rồi hai quái vật hạng nặng, rồi một trùm. Nếu viết trong code của bộ tạo quái, mỗi màn chơi cần một đoạn code riêng. Nếu lưu dưới dạng dữ liệu, danh sách nằm trong một asset, mỗi màn chơi có một asset, và một script của bộ tạo quái sẽ đọc asset được gán cho nó. Mỗi mục là một lớp [System.Serializable], nên Inspector của asset hiển thị danh sách:

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

Tất cả nằm trong một tệp, WaveSet.cs: ScriptableObject cần một tệp mang tên riêng, còn lớp Wave thông thường có thể nằm bên cạnh. Chọn một asset WaveSet, Inspector sẽ hiển thị Waves cùng Size và các hàng Element 0, Element 1, mỗi hàng có Enemy, Count và Spacing; nút + sẽ thêm một đợt quái. Bộ tạo quái duyệt danh sách bằng một 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");
    }
}

Với Level1 chứa 3 lính quèn, mỗi con cách nhau 0.5 giây, rồi đến 2 quái vật hạng nặng, lính quèn xuất hiện vào các thời điểm 0, 0.5 và 1 giây. Khoảng cách sau lính quèn cuối cùng và thời gian nghỉ 3 giây sẽ tiếp nối, rồi quái vật hạng nặng đầu tiên xuất hiện ở giây thứ 4.5. Bộ tạo quái của Level 2 dùng asset Level2 với các đợt quái khó hơn, còn script vẫn giữ nguyên.

challenge icon

Thử thách

Trung bình

Biến nhịp điệu của Dropper thành một asset nhạc.

  1. Trong DropPattern.cs, viết một lớp [System.Serializable] có tên Drop với int lane và float delay công khai.
  2. Bên dưới lớp đó, viết DropPattern : ScriptableObject với [CreateAssetMenu] và các thành phần công khai GameObject blockPrefab, float laneWidth, List<Drop> drops.
  3. Trong Dropper, dùng public DropPattern pattern;: với mỗi khối, chờ drop.delay, sau đó thả khối đã di chuyển theo trục x một khoảng drop.lane * pattern.laneWidth.

Nhấn Chơi: bốn khối rơi xuống. Sau đó nhấn Kiểm tra.

Tự làm thử

using System.Collections.Generic;
using UnityEngine;

// Đặt Drop (một khối: làn của nó và thời gian chờ trước đó) cùng DropPattern (tài nguyên) ở đây

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity