Menu
CoddyTech

Inspector의 열거형

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

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입니다. 모든 값이 x에 설정되어 있으면 HasFlag(x)는 true이고, ToString()은 설정된 값을 Fire, Poison처럼 나열합니다.

challenge icon

챌린지

쉬움

문에 여러 키카드가 필요하고 키링에도 여러 키카드를 보관할 수 있게 하세요.

  1. KeyRing.cs에서 Access 위에 [System.Flags]를 넣고, 값을 None = 0, Red = 1, Blue = 2, Green = 4로 지정하세요.
  2. Add(Access card)는 기존 키카드를 유지합니다: cards |= card;.
  3. Opens(Access needs)는 키링에 needs의 모든 키카드가 있을 때만 참을 반환합니다.

‘플레이’를 누르고 두 키카드를 모두 주우세요. Vault가 열립니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

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;
    }
}

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

직접 연습해 보세요: Unity 플레이그라운드