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.
Thử thách
Trung bìnhBiến nhịp điệu của Dropper thành một asset nhạc.
- Trong
DropPattern.cs, viết một lớp[System.Serializable]có tênDropvớiint lanevàfloat delaycông khai. - Bên dưới lớp đó, viết
DropPattern : ScriptableObjectvới[CreateAssetMenu]và các thành phần công khaiGameObject blockPrefab,float laneWidth,List<Drop> drops. - Trong
Dropper, dùngpublic 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ảngdrop.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
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity