게임개발/스터디

[스터디] Enum값을 flag로 사용하기

감물 2024. 4. 12. 17:28

게임을 개발할 때 여러가지 속성값을 갖는 데이터들이 존재한다. 스킬같은 경우는 불속성, 물속성, 바람속성 등 이 있을 수 있겠고 또 플레이어는 여러가지 상태라는 속성값이 있을 수 있다. 이런 속성들을 간편하게 사용하려면 속성을 Enum값으로 담고 비트 연산자 등을 사용하여 Enum값을 조합하는 등 Flag로 사용하는 것이다.

 

public enum GameState
{
    Menu = 1,
    Lobby = 2,
    JoinMenu = 4,
}

 

Enum 열거형으로 사용하며 Enum이 여러 속성들을 선택할 수 있게 해준다.

 

 

인스펙터 창에서 여러 속성들을 선택할 수도 있다.

 

 

enum(열거형)에서는 Flag(FlagsAttributes)속성이 있는데, 이를 이용하면 하나의 속성을 선택하는 것이 아니라 여러 속성을 선택하는 것이 가능하다. 다음의 코드는 열거형의 Flag연산을 쉽게 정리해 놓은 것이다.

 

[Flags]
enum MyEnum
{
  // None = 0, 와 같은 값을 선언할 수는 있으나 비트 단위 (bitwise) 로 조합되어 사용될 수는 없다
  FlagA = 1,
  FlagB = 2,
  FlagC = 4,
  FlagD = 8

  // 비트 단위 (bitwise) 연산을 하용하기 위해서는
  // 2 의 제곱수나 2의 제곱수의 조합을 사용해야 한다
}

var twoFlags = MyEnum.FlagA | MyEnum.FlagB;
// 이는 해당 변수가 갖는 모든 플래그들을 열거해 줄 것이다: "FlagA, FlagB".
Console.WriteLine(twoFlags);

 

Enum값을 Flag로 사용하기 위해서는 각 Enum값이 2의 제곱수로 값을 매겨주어야 한다. 그리고 비트 연산자를 사용하여 포함할 속성값들을 하나의 변수에 담을 수 있다.

 

[Flags]
enum FlagsEnum
{
 None = 0,
 Option1 = 1 << 0,
 Option2 = 1 << 1,
 Option3 = 1 << 2,
 
 Default = Option1 | Option3,
 All = Option1 | Option2 | Option3,
}

 

2의 제곱수들을 10진수 형태로 일일이 기술하는 것이 불편하면 좌측 시프트 연산자(<<)을 사용하여 선언할 수도 있다.

 

 

1) [Flags] 속성을 사용하면 아래와 같은 코드가 가능하다(두 속성을 하나의 변수에 담는 것)

FlagsEnum MyFlagsEnum = FlagsEnum.Option1 | FLagsEnum.Option2;

 

2) 값이 존재하는지 확인

if((MyFlagsEnum & FlagsEnum.Option1) != 0)

 

3) 특정 값을 추가

MyFlagsEnum |= FlagsEnum.Option3;

 

4) 특정 값을 제거

MyFlagsEnum &= ~FlagsEnum.Option3;

 

5) 특정 값을 반전(1은0으로, 0은 1로)

MyFlagsEnum ^= FlagsEnum.Option2;

 

6) 모든 값 삭제

MyFlagsEnum = FlagsEnum.None;

 

7) 모든 값 설정

MyFlagsEnum = FlagsEnum.All;

 

8) 특정 값을 제외하고 모두 설정

MyFlagsEnum = FlagsEnum.All ^ FlagsEnum.Option1 ^ FlagsEnum.Option2;

 

 

 

https://wlsdn629.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-Flag-%EC%86%8D%EC%84%B1

 

유니티 [Flag] 속성

[Flag] 속성이란 enum 열거형에서 사용할 수 있으며 enum이 여러 속성을 선택할 수 있게 해주는 기능입니다! [참고 사이트] https://dallcom-forever2620.tistory.com/15 [C#] enum 에서 Flags 속성달기 12345678910[Flags]pu

wlsdn629.tistory.com

https://nochoco-lee.tistory.com/560

 

22.2: Enum 값을 플래그 (flag) 로 사용하기

Section 22.2: Enum 값을 플래그 (flag) 로 사용하기 FlagsAttribute 를 사용하면 ToString() 메소드가 매칭되는 enum 값에 대해 동작하는 방식을 변경할 수 있다: [Flags] enum MyEnum { // None = 0, 와 같은 값을 선언할

nochoco-lee.tistory.com

https://roazium.tistory.com/190

 

[C#] enum의 Flag 연산

enum(열거형)에서는 Flag(FlagsAttribute)속성이 있는데, 이를 이용하면 하나의 속성을 선택하는 것이 아니라 여러 속성을 선택하는 것이 가능합니다.다음의 코드는 열거형의 Flag연산을 쉽게 정리해 놓

roazium.tistory.com