함께 작동하는 컴포넌트
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 아래로 내려가지 않도록 하는 것 등을 결정하고, 제트팩은 그저 요청할 뿐입니다. 나중에 연료가 잔량 표시기를 보여 주거나 픽업 아이템으로 재충전되더라도 제트팩은 변경되지 않습니다.
챌린지
쉬움스케이터의 대시는 무료입니다. 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;
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.