-
[유니티] Enum을 플래그 (Flag)로 만들어 다중선택 판단하기유니티 2023. 10. 17. 14:34
Enum을 플래그(Flag)로 만들어 인스펙터에서 다중 선택을 해 봅시다.
그리고 어떤 게 체크가 되어있는지 판단해 봅시다.
[Flags] public enum EActType { None = 0, Run = 1 << 0, Fly = 1 << 1, Speak = 1 << 2, } public EActType eActType; void Start() { if (eActType.HasFlag(EActType.Fly)) print("Fly 가지고 있음"); if (eActType.HasFlag(EActType.Run | EActType.Fly)) print("Run과 Fly 둘다 가지고 있음"); if (eActType.HasFlag(EActType.Run) || eActType.HasFlag(EActType.Fly)) print("Run또는 Fly를 가지고 있음"); }
Enum을 선언할 때 애트리뷰트로 [Flags]를 붙혀 Enum Flags라고 해줍니다.
또 안에 값을 넣는게 중요한데 None은 0으로 만들어 두어 선택할 때 없는 상태를 명시할 수 있습니다.
그리고 이후 값들은 시프트 비트연산으로 순서대로 값을 대입합니다.
1 << 2 라면 1이란 값을 두번 옮긴 것을 이진법으로 표현한 것으로 4입니다.
Enum 시프트 연산자 대입값 이진법 십진법 None 0 0000 0 Run 1 << 0 0001 1 Fly 1 << 1 0010 2 Speak 1 << 2 0100 4 이진법은 (2)라고 표현하겠습니다.
Run과 Fly를 두개 체크하면 0001(2) + 0010(2) = 0011(2) 이 됩니다.
0011(2) 은 십진법으로 3입니다.
HasFlag로 계산하기
HasFlag는 AND 비트연산을 해서 0이 아니면 true, 0이면 false를 반환합니다.
AND 비트연산(&)은 모두 1이어야 1을 반환합니다.
1. eActType.HasFlag(EActType.Fly)
결과값이 0이 아니기 때문에 true입니다.
2. eActType.HasFlag(EActType.Run | EActType.Fly)
OR 비트연산 |는 둘중 하나라도 1이면 1을 반환합니다.
먼저 EActType.Run | EActType.Fly를 계산하고 HasFlag로 계산합니다.
결과값이 0이 아니기 때문에 true입니다.
3. eActType.HasFlag(EActType.Run) || eActType.HasFlag(EActType.Fly)
||
OR 연산(||)은 둘 중 하나라도 true이면 true입니다.
앞의 결과도 0이 아니기 때문에 true이고, 뒤의 결과도 0이 아니기 때문에 true입니다.
결과값은 true || true 이기에 true입니다.
'유니티' 카테고리의 다른 글
[유니티] 빌더 패턴 (Builder Pattern) - 디자인 패턴 (0) 2023.10.31 [유니티] 옵저버 패턴 (Observer Pattern) - 디자인 패턴 (2) 2023.10.18 [유니티] 리스트 foreach에서 제거하기 - list for foreach remove (2) 2023.10.16 [유니티][에셋] 로그 뷰어 (Log Viewer)로 빌드시 로그 확인하기 (2) 2023.09.21 [유니티][에셋] 이지세이브 (Easy Save) 로 진짜 쉽게 데이터 저장 (0) 2023.09.21