Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Doskok ł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śli current jest co najmniej równe cost, odejmuje ona cost od current i zwraca true; w przeciwnym razie pozostawia current bez zmian i zwraca false.
  • 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ę komunikat Too 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;
        }
    }
}
quiz iconSprawdź się

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