Các trường UnityEvent
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 14 trên 64.
On Click () của một nút là một trường UnityEvent, và script của bạn cũng có thể có trường này. Một trường UnityEvent công khai sẽ xuất hiện trong Inspector dưới dạng danh sách cùng kiểu, và script kích hoạt sự kiện đó bằng Invoke() mà không cần biết những gì được nối với nó. Bộ đếm ngược này tích tắc mỗi giây một lần:
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}Trong Inspector, On Finished () có các hàng giống như nút: một hàng phóng tên lửa, hàng khác mở cổng. Ở màn chơi khác, bạn có thể dùng lại Countdown với các hàng khác, không cần viết script mới. UnityEvent<int> truyền một giá trị. Trong danh sách thả xuống, phương thức nhận một int sẽ xuất hiện dưới mục Dynamic int, và hàng đó nhận giá trị được truyền cho Invoke, ở đây là số giây còn lại. Cùng phương thức đó trong mục Static Parameters sẽ nhận một số được nhập vào hàng thay thế, và bạn cũng có thể nối các phương thức không có tham số.
Unity tạo một trường UnityEvent khi tải script, nên onTick không bao giờ là null và không cần ?.; code cũng có thể thêm listener bằng onTick.AddListener(ShowSeconds). Hãy chọn UnityEvent khi phản ứng khác nhau tùy từng đối tượng và được thiết lập trong Inspector, bởi bạn hoặc một nhà thiết kế không bao giờ mở script. Hãy chọn sự kiện C# khi code lắng nghe: trình biên dịch kiểm tra tên phương thức, nên việc đổi tên sẽ khiến quá trình build thất bại thay vì âm thầm để lại một hàng <Missing>, và sự kiện C# không bao giờ xuất hiện trong Inspector.
Thử thách
DễThêm các sự kiện mà các hàng trong cảnh được kết nối vào FinishLine.
- Thêm
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;và một biến int riêng để lưu số vòng đã hoàn thành. - Trong
OnTriggerEnter, khiothercó thẻPlayer, hãy tính vòng đua và gọionLap.Invokevới số vòng đã hoàn thành. - Khi đạt đến
laps, hãy gọionRaceOver.Invoke(); sau đó, việc băng qua vạch đích sẽ không làm gì cả.
Nhấn Chơi và lái xe ba vòng. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// Xe đã vượt qua vạch đích: hoàn thành thêm một vòng đua
}
}
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