Lớp có thể tuần tự hóa
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 18 trên 64.
Một script có nhiều thiết lập sẽ tạo ra một danh sách phẳng dài trong Inspector. Bạn có thể dùng một lớp C# thông thường để nhóm chúng lại: đánh dấu lớp bằng [System.Serializable], rồi một trường thuộc lớp đó sẽ hiển thị thành một mục có thể mở rộng mang tên trường, bên trong là các trường của lớp. Một lớp có thể dùng cho nhiều trường và nhiều script:
[System.Serializable]
public class Stats
{
public float speed = 2f;
public int damage = 10;
}
public class Enemy : MonoBehaviour
{
public Stats normal;
public Stats enraged;
private Stats current;
void Start()
{
current = normal;
}
void Update()
{
transform.Translate(0f, 0f, current.speed * Time.deltaTime);
}
public void Enrage()
{
current = enraged;
}
}Inspector hiển thị hai mục có thể mở rộng, Normal và Enraged, mỗi mục có Speed và Damage. Mỗi Enemy có hai đối tượng Stats riêng, được điền trong Inspector riêng, và code đọc chúng như normal.speed. Unity tạo các đối tượng này khi tải script, vì vậy normal không bao giờ là null ngay cả khi không có = new Stats(), và các giá trị khởi tạo của trường (2 và 10) là giá trị ban đầu của một Enemy mới. Một struct cũng hoạt động tương tự với thuộc tính này, [System.Serializable] public struct Range { public float min; public float max; }, và giống như Vector3, nó được sao chép khi gán.
Cần có thuộc tính này vì Unity chỉ lưu các kiểu dữ liệu mà nó được yêu cầu lưu. Nếu thiếu thuộc tính này, lớp sẽ không hiển thị trong Inspector: không có mục nào để mở rộng, các giá trị đặt ở đó sẽ không được lưu, và Unity cũng không tạo đối tượng, nên normal.speed gây ra NullReferenceException. Bên trong lớp, các quy tắc Inspector thông thường vẫn áp dụng: dùng trường public hoặc trường private có [SerializeField], không dùng thuộc tính hay trường static.
Thử thách
DễNhóm các thiết lập của từng tia sáng vào một struct.
- Phía trên
Flashlight, khai báopublic struct Beamvới các trường công khaiColor color,float rangevàfloat angle. Đánh dấu struct bằng[System.Serializable]để Inspector hiển thị nó. - Thay sáu trường riêng lẻ bằng
public Beam wide;vàpublic Beam focused;. - Trong
Apply(), đặt ba giá trị của đèn từfocusedOn ? focused : wide.
Nhấn Chơi rồi nhấn Space: tia sáng chiếu tới tinh thể. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
using UnityEngine.InputSystem;
public class Flashlight : MonoBehaviour
{
public Color wideColor = Color.white;
public float wideRange = 5f;
public float wideAngle = 60f;
public Color focusedColor = Color.white;
public float focusedRange = 10f;
public float focusedAngle = 30f;
private bool focusedOn;
private Light lamp;
void Start()
{
lamp = GetComponent<Light>();
Apply();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
focusedOn = !focusedOn;
Apply();
}
}
void Apply()
{
lamp.color = focusedOn ? focusedColor : wideColor;
lamp.range = focusedOn ? focusedRange : wideRange;
lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
}
}
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