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>.
Wyzwanie
ŚredniNapisz jedną uniwersalną funkcję pomocniczą dla skrzyń i lamp wieży rażącej prądem.
- W pliku
Helpers.csnapisz klasę statycznąHelpersz 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. - W
Pulse, po naciśnięciu spacji, nadaj każdemu obiektowi Rigidbody w zasięgu impuls skierowany w górę o wartościlift. - 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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity