Współpracujące komponenty
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 4 z 64.
Małe komponenty nadal potrzebują siebie nawzajem. Plecak odrzutowy potrzebuje paliwa na tym samym obiekcie, więc raz wyszukuje komponent Fuel w Awake, zapisuje go w polu i komunikuje się z nim za pomocą dwóch niewielkich metod publicznych:
public class Fuel : MonoBehaviour
{
public float amount = 10f;
public bool IsEmpty()
{
return amount <= 0f;
}
public void Burn(float units)
{
amount = Mathf.Max(amount - units, 0f);
}
}[RequireComponent(typeof(Fuel))]
public class Jetpack : MonoBehaviour
{
public float lift = 4f;
private Fuel fuel;
void Awake()
{
fuel = GetComponent<Fuel>();
}
void Update()
{
if (Keyboard.current.spaceKey.isPressed && !fuel.IsEmpty())
{
fuel.Burn(Time.deltaTime);
transform.position += Vector3.up * lift * Time.deltaTime;
}
}
}[RequireComponent(typeof(Fuel))] sprawia, że Unity dodaje komponent Fuel za każdym razem, gdy dodajesz Jetpack — w Edytorze lub za pomocą AddComponent — i nie pozwala usunąć tego komponentu Fuel, dopóki Jetpack znajduje się na obiekcie. Unity sprawdza to tylko w chwili dodania Jetpack, więc Jetpack, który znajdował się już na obiekcie, zanim napiszesz ten atrybut, zachowuje swoją dotychczasową konfigurację. Awake to właściwe miejsce, aby pobrać ten komponent: ta metoda uruchamia się raz, a do tego czasu wszystkie komponenty danego obiektu są już dostępne.
Jetpack nigdy sam nie zmienia wartości amount. To Fuel określa, co oznacza spalanie, na przykład że wartość nigdy nie spada poniżej 0, a Jetpack jedynie o to prosi. Jeśli później Fuel będzie wyświetlać wskaźnik albo uzupełniać paliwo z podnoszonych przedmiotów, Jetpack nie będzie wymagać zmian.
Wyzwanie
ŁatwySpraw, by zryw łyżwiarza zużywał wytrzymałość.
- W
Staminadodajpublic bool TrySpend(float cost): jeślicurrentjest większe lub równecost, odejmij tę wartość i zwróćtrue, w przeciwnym razie zwróćfalse. - Umieść
[RequireComponent(typeof(Stamina))]nadpublic class Dashi pobierz ten komponent do pola wAwake(). - Po naciśnięciu spacji wykonaj zryw tylko wtedy, gdy
TrySpend(cost)zwrócitrue; w przeciwnym razie zalogujToo tired.
Naciśnij „Graj”: po dwóch zrywach w konsoli pojawi się komunikat Too tired. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
using UnityEngine.InputSystem;
public class Dash : MonoBehaviour
{
public float distance = 3f;
public float cost = 40f;
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
transform.position += Vector3.forward * distance;
}
}
}
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