Menu
CoddyTech

함께 작동하는 컴포넌트

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 4번째.

작은 컴포넌트끼리도 서로 필요로 할 수 있습니다. Jetpack은 같은 오브젝트에 Fuel이 필요하므로 Awake에서 Fuel을 한 번 찾아 필드에 저장한 다음, 두 개의 간단한 public 메서드로 Fuel과 통신합니다.

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))]를 사용하면 Editor에서 Jetpack을 추가하거나 AddComponent로 추가할 때 Unity가 Fuel도 함께 추가하며, Jetpack이 있는 동안에는 Fuel을 제거하지 못하게 합니다. Unity는 Jetpack을 추가하는 순간에만 이를 확인하므로, 이 속성을 작성하기 전에 이미 오브젝트에 있던 Jetpack은 기존 구성을 그대로 유지합니다. 가져오기는 Awake에서 하면 됩니다. Awake는 한 번 실행되고, 그때는 오브젝트의 모든 컴포넌트가 준비되어 있기 때문입니다.

Jetpack은 amount를 직접 변경하지 않습니다. Fuel이 연료 소모 방식을 결정하므로 값이 0 아래로 내려가지 않도록 할 수 있고, Jetpack은 그저 요청만 합니다. 나중에 Fuel에 게이지 표시 기능이나 아이템 획득 시 연료를 보충하는 기능이 추가되어도 Jetpack은 변경할 필요가 없습니다.

challenge icon

챌린지

쉬움

스케이터의 대시에 스태미나 소모를 추가하세요.

  1. Stamina에 public bool TrySpend(float cost)를 추가하세요. current가 cost 이상이면 해당 값을 차감하고 true를 반환하고, 그렇지 않으면 false를 반환하세요.
  2. public class Dash 위에 [RequireComponent(typeof(Stamina))]를 넣고, Awake()에서 해당 컴포넌트를 가져와 필드에 저장하세요.
  3. 스페이스 키를 누르면 TrySpend(cost)가 참일 때만 대시하고, 그렇지 않으면 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 플레이그라운드