Menu
CoddyTech

함께 작동하는 컴포넌트

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

작은 컴포넌트끼리도 서로를 필요로 합니다. 제트팩은 같은 오브젝트에 연료가 필요하므로 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))]을 사용하면 에디터에서나 AddComponent로 제트팩을 추가할 때마다 Unity가 연료를 추가하며, 제트팩이 있는 동안에는 해당 연료를 제거하지 못하게 합니다. Unity는 제트팩을 추가하는 순간에만 이를 확인하므로, 이 특성을 작성하기 전에 이미 오브젝트에 있던 제트팩은 기존 설정을 유지합니다. 가져오는 작업은 Awake에서 하면 됩니다. Awake는 한 번 실행되며, 그때쯤이면 오브젝트 자체의 모든 컴포넌트가 준비되어 있습니다.

제트팩은 amount를 직접 변경하지 않습니다. 연료가 연료를 소모한다는 것이 무엇을 의미하는지, 예를 들어 값이 0 아래로 내려가지 않도록 하는 것 등을 결정하고, 제트팩은 그저 요청할 뿐입니다. 나중에 연료가 잔량 표시기를 보여 주거나 픽업 아이템으로 재충전되더라도 제트팩은 변경되지 않습니다.

challenge icon

챌린지

쉬움

스케이터의 대시는 무료입니다. Space를 누를 때마다 스케이터를 앞쪽(+z)으로 3단위 이동시킵니다. 대시에 스태미나 비용이 들도록 만드세요. 화살표 키로 스케이터를 이동할 수 있고(Mover.cs는 준비되어 있음), Stamina.cs는 이미 초당 current를 regen만큼 회복시켜 max(100)까지 채웁니다.

  • Stamina에 공개 메서드 bool TrySpend(float cost)를 추가하세요. current가 cost 이상이면 current에서 cost를 빼고 true를 반환합니다. 그렇지 않으면 current를 그대로 두고 false를 반환합니다.
  • Dash가 오브젝트에 Stamina를 필요로 하도록 만드세요. 그러면 Dash를 추가할 때마다 Unity가 Stamina를 추가합니다. 필드에 담아 Awake에서 한 번 가져오세요.
  • 대시에는 cost만큼의 비용이 듭니다(Inspector에서 40으로 설정). TrySpend가 허용할 때만 Space를 눌러 대시하고, 그렇지 않으면 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;
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨