Menu
CoddyTech

Generyczne metody pomocnicze

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

Niektóre metody pomocnicze są takie same dla każdego typu: pobierają komponent lub dodają go albo wybierają losowy element z tablicy. Metoda generyczna pozwala zapisać je raz, przekazując typ jako parametr 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 obietnica dotycząca T, która określa, co metoda może z nim zrobić. AddComponent przyjmuje tylko komponenty, więc bez tego ograniczenia kompilator odrzuca go.AddComponent<T>(); z nim działają dowolne komponenty — Rigidbody z Unity lub twoje własne skrypty. Ograniczenie udostępnia też wszystkie składowe Component dla T, takie jak .transform i .gameObject. Jeśli skrzynia ma już Rigidbody, zostanie zwrócony ten komponent i nic nie zostanie dodane.

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

challenge icon

Wyzwanie

Średni

Napisz jedną uniwersalną funkcję pomocniczą dla skrzyń i lamp wieży rażącej prądem.

  1. W pliku Helpers.cs napisz klasę statyczną Helpers z publiczną metodą InRange<T>(IEnumerable<T> items, Vector3 center, float range) dla komponentów: ma zwracać tablicę List<T> elementów znajdujących się w odległości nie większej niż range.
  2. W Pulse, po naciśnięciu spacji, nadaj każdemu obiektowi Rigidbody w zasięgu impuls skierowany w górę o wartości lift.
  3. Następnie wywołaj TurnOn() na każdej lampie Lamp w zasięgu.

Naciśnij „Graj” i spację: pobliska skrzynia podskoczy. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: elementy znajdujące się w zasięgu punktu

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity