Menu
CoddyTech

Компоненты работают вместе

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 4 из 64.

Даже небольшие компоненты зависят друг от друга. Для Jetpack нужен Fuel на том же объекте, поэтому он находит Fuel один раз в Awake, сохраняет его в поле и обращается к нему через два небольших публичных метода:

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))] заставляет Unity добавлять Fuel при добавлении Jetpack — в редакторе или с помощью AddComponent — и не позволяет удалить Fuel, пока на объекте есть Jetpack. Unity проверяет это только в момент добавления Jetpack, поэтому Jetpack, который уже был на объекте до добавления атрибута, сохранит прежнюю конфигурацию. Awake — подходящее место, чтобы получить его: этот метод выполняется один раз, и к тому времени все компоненты самого объекта уже доступны.

Jetpack никогда не меняет amount самостоятельно. Fuel определяет, что значит сжигать топливо, например не позволять значению опускаться ниже 0, а Jetpack только отправляет запрос. Если позднее Fuel будет показывать шкалу или пополняться от подбираемых предметов, Jetpack не придётся менять.

challenge icon

Задание

Легко

Сделай рывок фигуриста затратным по выносливости.

  1. В Stamina добавь public bool TrySpend(float cost): если current не меньше cost, вычти его и верни true, иначе — false.
  2. Размести [RequireComponent(typeof(Stamina))] над public class Dash и получи этот компонент в поле в Awake().
  3. При нажатии пробела выполняй рывок, только если TrySpend(cost) возвращает true; иначе выведи в журнал Too tired.

Нажми «Играть»: после двух рывков в Console появится Too tired. Затем нажми «Проверить».

Попробуйте сами

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;
        }
    }
}

Все уроки раздела Архитектура игр в Unity

Потренируйтесь самостоятельно: Песочница Unity