Các thành phần phối hợp với nhau
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 4 trên 64.
Các thành phần nhỏ vẫn cần đến nhau. Jetpack cần Fuel trên cùng một đối tượng, vì vậy nó tìm Fuel một lần trong Awake, lưu Fuel vào một trường và gọi Fuel thông qua hai phương thức công khai nhỏ:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] khiến Unity thêm Fuel mỗi khi bạn thêm Jetpack, trong Editor hoặc bằng AddComponent, đồng thời không cho xóa Fuel khi Jetpack vẫn còn trên đối tượng. Unity chỉ kiểm tra điều này vào lúc thêm Jetpack, vì vậy một Jetpack đã có trên đối tượng trước khi bạn viết thuộc tính này sẽ giữ nguyên thiết lập cũ. Awake là nơi lấy Fuel: hàm này chạy một lần, và khi đó mọi thành phần của đối tượng đều đã có sẵn.
Jetpack không bao giờ tự thay đổi amount. Fuel quyết định việc tiêu hao diễn ra như thế nào, chẳng hạn như không bao giờ giảm xuống dưới 0, còn Jetpack chỉ gửi yêu cầu. Nếu sau này Fuel hiển thị đồng hồ đo hoặc nạp lại từ vật phẩm nhặt được, Jetpack không cần thay đổi.
Thử thách
DễTiêu hao thể lực của vận động viên trượt ván khi lướt nhanh.
- Trong
Stamina, thêmpublic bool TrySpend(float cost): nếucurrentlớn hơn hoặc bằngcost, hãy trừ đi giá trị đó rồi trả vềtrue, nếu không thì trả vềfalse. - Đặt
[RequireComponent(typeof(Stamina))]phía trênpublic class Dash, rồi lấy thành phần đó và lưu vào một trường trongAwake(). - Khi nhấn Space, chỉ lướt nhanh nếu
TrySpend(cost)trả vềtrue, nếu không thì ghi nhật kýToo tired.
Nhấn Chơi: sau hai lần lướt nhanh, Console hiển thị Too tired. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
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