Menu
CoddyTech

Các hàm hỗ trợ tổng quát

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 44 trên 64.

Một số tiện ích dùng được với mọi kiểu: lấy một thành phần hoặc thêm thành phần đó, chọn ngẫu nhiên một mục trong mảng. Phương thức tổng quát cho phép viết chúng một lần, với kiểu làm tham số T mà mỗi lần gọi sẽ điền vào:

public static class Helpers
{
    public static T GetOrAdd<T>(this GameObject go) where T : Component
    {
        if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
        return found;
    }

    public static T RandomItem<T>(T[] items)
    {
        return items[Random.Range(0, items.Length)];
    }
}
Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);

where T : Component là một cam kết về T, quyết định phương thức có thể làm gì với kiểu này. AddComponent chỉ nhận các thành phần, nên nếu không có ràng buộc, trình biên dịch sẽ từ chối go.AddComponent<T>(); khi có ràng buộc, mọi thành phần đều dùng được, dù là Rigidbody của Unity hay các script của bạn. Ràng buộc này cũng cho phép bạn truy cập mọi thành viên của Component trên T, chẳng hạn như .transform và .gameObject. Nếu crate đã có Rigidbody, phương thức sẽ trả về thành phần đó mà không thêm gì.

RandomItem không có ràng buộc vì phương thức này không tác động đến T: nó dùng được với màu sắc, chuỗi và prefab. Bạn hiếm khi cần ghi kiểu khi gọi phương thức: từ colors, một Color[], trình biên dịch suy ra T là Color. Phương thức nhận IEnumerable<T> thay vì T[] sẽ chấp nhận cả mảng lẫn List, bao gồm cả các mảng mà FindObjectsByType<T> trả về.

challenge icon

Thử thách

Trung bình

Viết một hàm trợ giúp tổng quát cho các thùng hàng và đèn của tháp xung kích.

  1. Trong Helpers.cs, viết lớp tĩnh Helpers với InRange<T>(IEnumerable<T> items, Vector3 center, float range) công khai cho các thành phần: trả về một List<T> gồm các mục cách không quá range.
  2. Trong Pulse, khi nhấn Space, tạo xung lực hướng lên có độ lớn lift cho mọi Rigidbody trong phạm vi.
  3. Sau đó gọi TurnOn() trên mọi Lamp trong phạm vi.

Nhấn Chơi rồi nhấn Space: thùng hàng ở gần sẽ bật lên. Sau đó nhấn Kiểm tra.

Tự làm thử

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: các phần tử nằm trong phạm vi của một điểm

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity