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>.
Wyzwanie
ŚredniWież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.csnapisz klasę statycznąHelpersz 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żejrangeodcenter. - W pliku
Pulse.cs, po naciśnięciu klawisza Space: każdy obiekt Rigidbody w scenie znajdujący się w odległościrangeod wieży otrzymuje impuls skierowany w górę o silelift, a każda lampa Lamp znajdująca się w odległościrangezostaje zapalona. Użyj InRange dla obu typów obiektów, na tablicach zwracanych przezFindObjectsByType.
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
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest