Współpracujące komponenty
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 4 z 50.
Małe komponenty nadal potrzebują siebie nawzajem. Plecak odrzutowy potrzebuje paliwa na tym samym obiekcie, więc raz wyszukuje komponent Fuel w metodzie Awake, przechowuje 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))] powoduje, że Unity dodaje komponent Fuel za każdym razem, gdy dodawany jest 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 był już na obiekcie, zanim dodasz ten atrybut, zachowuje swoją wcześniejszą konfigurację. Awake to miejsce, w którym należy pobrać ten komponent: metoda jest wywoływana raz i do tego czasu wszystkie komponenty obiektu są już dostępne.
Jetpack nigdy sam nie zmienia wartości amount. To Fuel określa, co oznacza spalanie paliwa, na przykład że jego ilość nigdy nie spada poniżej 0, a Jetpack jedynie o to prosi. Jeśli Fuel później wyświetla wskaźnik poziomu paliwa lub uzupełnia je po zebraniu przedmiotów, Jetpack nie wymaga zmian.
Wyzwanie
ŁatwyDoskok łyżwiarki jest darmowy: klawisz Space przenosi ją o 3 jednostki do przodu (+z) za każdym naciśnięciem. Spraw, by kosztował wytrzymałość. Strzałkami sterujesz jej ruchem (Mover.cs jest gotowy), a Stamina.cs już uzupełnia current o regen na sekundę, maksymalnie do max (100).
- W Stamina dodaj publiczną metodę
bool TrySpend(float cost). Jeślicurrentjest co najmniej równecost, odejmuje onacostodcurrenti zwracatrue; w przeciwnym razie pozostawiacurrentbez zmian i zwracafalse. - Spraw, by obiekt Dash wymagał komponentu Stamina, tak aby Unity dodawało go za każdym razem, gdy dodawany jest Dash. Pobierz go tylko raz, w Awake, i zapisz w polu.
- Doskok kosztuje
cost(w Inspectorze ustawiono 40). Po naciśnięciu Space doskok wykonuje się tylko wtedy, gdy TrySpend na to pozwala; w przeciwnym razie wyświetla się komunikatToo tired.
Naciśnij Graj i wykonuj doskoki, aż łyżwiarka się zmęczy, a 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;
}
}
}
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