Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Spraw, by zryw łyżwiarza zużywał wytrzymałość.

  1. W Stamina dodaj public bool TrySpend(float cost): jeśli current jest większe lub równe cost, odejmij tę wartość i zwróć true, w przeciwnym razie zwróć false.
  2. Umieść [RequireComponent(typeof(Stamina))] nad public class Dash i pobierz ten komponent do pola w Awake().
  3. Po naciśnięciu spacji wykonaj zryw tylko wtedy, gdy TrySpend(cost) zwróci true; w przeciwnym razie zaloguj Too 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

Poćwicz samodzielnie: Edytor online Unity