Inspector의 열거형
Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 17번째.
enum 필드는 Inspector에서 드롭다운으로 표시되므로, 하나의 스크립트를 공유하는 오브젝트를 설정하는 편리한 방법입니다. 하나의 Pickup 프리팹으로 코인, 하트, 실드를 모두 처리할 수 있습니다. 레벨의 각 복사본은 드롭다운에서 종류를 지정하고, 스크립트는 그 값에 따라 분기합니다.
public enum PickupKind { Coin, Heart, Shield }
public class Pickup : MonoBehaviour
{
public PickupKind kind;
public int amount = 1;
void OnTriggerEnter(Collider other)
{
if (!other.TryGetComponent(out PlayerStats stats)) return;
switch (kind)
{
case PickupKind.Coin: stats.coins += amount; break;
case PickupKind.Heart: stats.hp += amount; break;
case PickupKind.Shield: stats.shielded = true; break;
}
Destroy(gameObject);
}
}씬은 각 선택 항목을 값의 숫자로 저장합니다. Coin은 0, Heart는 1, Shield는 2입니다. 값을 끝에 추가하는 것은 안전합니다. 앞에 값을 삽입하면, 예를 들어 { Gem, Coin, Heart, Shield }처럼 되면 모든 숫자가 밀리고, 모든 씬의 모든 픽업 종류가 바뀝니다. 값의 이름을 변경하는 것은 숫자가 그대로 유지되므로 안전합니다. 숫자를 Coin = 0, Heart = 1, Shield = 2처럼 명시하면, 저장된 선택 항목은 그대로 둔 채 나중에 이름의 순서를 바꿀 수 있습니다.
[System.Flags] enum은 여러 값을 한 번에 담습니다. 드롭다운에는 각 값 옆에 체크 표시가 있으며, Nothing과 Everything도 있습니다. 각 값은 고유한 비트가 필요하므로 숫자는 2의 거듭제곱이어야 합니다.
[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }
public Element immuneTo; // Inspector에서 체크됨: Fire와 Poison
public void Hit(int damage, Element element)
{
if (immuneTo.HasFlag(element)) return;
hp -= damage;
}|는 값을 결합합니다. Element.Fire | Element.Poison은 5입니다. HasFlag(x)는 x의 모든 값이 설정되어 있을 때 true를 반환하고, ToString()은 설정된 값을 Fire, Poison처럼 나열합니다.
챌린지
쉬움기지에는 문이 세 개 있습니다. 창고 문에는 빨간 키카드가, 연구실 문에는 파란 키카드가, 금고 문에는 두 카드가 모두 필요합니다. 각 문의 needs와 각 카드의 card는 Access 열거형을 사용해 Inspector에서 설정되어 있고, Door.cs와 Keycard.cs는 준비되어 있습니다. 화살표 키로 Player를 이동하며, Player의 KeyRing에는 주운 카드가 보관됩니다. KeyRing.cs를 완성하세요.
- 여러 카드를 조합할 수 있는 열거형으로
Access를 만드세요. 그래야 문에 여러 카드가 필요하고, 키링에도 여러 카드를 보관할 수 있습니다. 네 가지 이름은 None, Red, Blue, Green으로 유지하세요. Add(Access card)는 이미 키링에 있는 카드를 그대로 유지하면서 카드를 키링에 추가합니다.Opens(Access needs)는 키링에needs에 포함된 카드가 모두 있으면 true를 반환합니다.
플레이를 눌러 문을 확인하고, 카드를 주운 다음 확인을 누르세요.
직접 해보기
using UnityEngine;
public enum Access { None, Red, Blue, Green }
public class KeyRing : MonoBehaviour
{
public Access cards;
public void Add(Access card)
{
// 이미 있는 카드는 그대로 두고 새 카드를 링에 추가한다
}
public bool Opens(Access needs)
{
// 링에 needs에 포함된 모든 카드가 있으면 true
return false;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.