Kiểu liệt kê trong Inspector
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 20 trên 64.
Trường enum hiển thị trong Inspector dưới dạng danh sách thả xuống, rất tiện để thiết lập các đối tượng dùng chung một script. Một prefab Pickup dùng cho xu, tim và khiên: mỗi bản sao trong màn chơi nhận loại của nó từ danh sách thả xuống, còn script xử lý loại đó như sau:
public enum PickupKind { Coin, Heart, Shield }
public class Pickup : MonoBehaviour
{
public PickupKind kind;
public int amount = 1;
void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent(out PlayerStats stats)) return;
switch (kind)
{
case PickupKind.Coin: stats.coins += amount; break;
case PickupKind.Heart: stats.hp += amount; break;
case PickupKind.Shield: stats.shielded = true; break;
}
Destroy(gameObject);
}
}Cảnh lưu mỗi lựa chọn dưới dạng số tương ứng với giá trị đó: Coin là 0, Heart là 1, Shield là 2. Thêm một giá trị vào cuối thì an toàn. Chèn một giá trị vào đầu, như trong { Gem, Coin, Heart, Shield }, sẽ làm thay đổi mọi số, khiến mọi vật phẩm nhặt được trong tất cả các cảnh đổi loại. Đổi tên một giá trị thì an toàn vì số tương ứng vẫn giữ nguyên. Ghi rõ các số, Coin = 0, Heart = 1, Shield = 2, cho phép bạn sắp xếp lại tên sau này mà không làm thay đổi lựa chọn đã lưu.
Enum [System.Flags] lưu nhiều giá trị cùng lúc. Danh sách thả xuống có một ô đánh dấu cho mỗi giá trị, cùng với Nothing và Everything. Mỗi giá trị cần một bit riêng, nên các số là lũy thừa của hai:
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // Đã tích chọn trong Inspector: Fire và Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}| kết hợp các giá trị: Element.Fire | Element.Poison là 5. HasFlag(x) trả về true khi mọi giá trị trong x đều được bật, còn ToString() liệt kê các giá trị đang được bật, như Fire, Poison.
Thử thách
DễĐể một cánh cửa cần nhiều thẻ khóa và vòng chìa khóa giữ được nhiều thẻ.
- Trong
KeyRing.cs, đặt[System.Flags]phía trênAccessvà đánh số như sau:None = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)giữ lại các thẻ đã có:cards |= card;.Opens(Access needs)chỉ trả về true khi vòng chìa khóa giữ đủ mọi thẻ trongneeds.
Nhấn Chơi và nhặt cả hai thẻ: Vault sẽ mở. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// Thêm thẻ vào vòng, giữ nguyên các thẻ đã có
}
public bool Opens(Access needs)
{
// true khi vòng chứa tất cả thẻ trong needs
return false;
}
}
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