Menu
CoddyTech

Generyczne metody pomocnicze

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 35 z 50.

Niektóre metody pomocnicze są takie same dla każdego typu: pobierają komponent lub dodają go, wybierają losowy element z tablicy. Metoda generyczna pozwala napisać je raz, z typem jako parametrem T, który każde wywołanie uzupełnia:

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 to deklaracja dotycząca T, która określa, co metoda może z nim zrobić. AddComponent przyjmuje tylko komponenty, więc bez tego ograniczenia kompilator odrzuci go.AddComponent<T>(); z nim działa każdy komponent — Rigidbody z Unity lub Twoje własne skrypty. Ograniczenie daje też dostęp do wszystkich składowych Component dla T, takich jak .transform i .gameObject. Jeśli skrzynia ma już Rigidbody, otrzymasz z powrotem ten komponent i nic nie zostanie dodane.

RandomItem nie ma ograniczenia, bo nigdy nie korzysta z T: działa tak samo dla kolorów, ciągów znaków i prefabów. Rzadko podajesz typ podczas wywołania: na podstawie colors, czyli tablicy Color[], kompilator ustala, że T to Color. Metoda, która przyjmuje IEnumerable<T> zamiast T[], akceptuje zarówno tablice, jak i listy, w tym tablice zwracane przez FindObjectsByType<T>.

challenge icon

Wyzwanie

Średni

Wieża uderzeniowa stoi na podwórku. Po naciśnięciu klawisza Space wysyła impuls: skrzynie znajdujące się w odległości do 4 jednostek od niej zostają wyrzucone w górę, a lampy w odległości do 4 jednostek zapalają się. Lamp.cs jest gotowy i zawiera metodę TurnOn(). Napisz jedną funkcję pomocniczą, która wyszukuje oba rodzaje obiektów:

  • W pliku Helpers.cs napisz klasę statyczną Helpers z metodą generyczną InRange<T>(IEnumerable<T> items, Vector3 center, float range) dla dowolnego typu komponentu. Zwraca ona listę List<T> elementów, których położenie znajduje się w odległości najwyżej range od center.
  • W pliku Pulse.cs, po naciśnięciu klawisza Space: każdy obiekt Rigidbody w scenie znajdujący się w odległości range od wieży otrzymuje impuls skierowany w górę o sile lift, a każda lampa Lamp znajdująca się w odległości range zostaje zapalona. Użyj InRange dla obu typów obiektów, na tablicach zwracanych przez FindObjectsByType.

Naciśnij Graj, naciśnij Space, a następnie Sprawdź.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: elementy w zasięgu punktu
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity