함께 작동하는 컴포넌트
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은 변경할 필요가 없습니다.
챌린지
쉬움스케이터의 대시에 스태미나 소모를 추가하세요.
Stamina에public bool TrySpend(float cost)를 추가하세요.current가cost이상이면 해당 값을 차감하고true를 반환하고, 그렇지 않으면false를 반환하세요.public class Dash위에[RequireComponent(typeof(Stamina))]를 넣고,Awake()에서 해당 컴포넌트를 가져와 필드에 저장하세요.- 스페이스 키를 누르면
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 플레이그라운드