게임을 개발하다 보면 하나의 공격에 여러 속성이 섞이거나, 플레이어가 동시에 여러 버프를 얻는 등 한 객체가 여러 상태를 동시에 지니는 상황이 자주 발생한다. 이때 각 상태를 개별 변수로 관리하면, 상태가 중첩될 때마다 if문으로 일일이 검사해야 하고, 새로운 상태가 추가될 때마다 관련된 조건문과 변수도 함께 늘어나 코드가 복잡해진다. 결국 유지보수가 어려워지고, 시스템이 커질수록 관리 비용이 기하급수적으로 증가하게 된다.
이때 다중 상태 관리를 효율적으로 도와주는 개념이 바로 비트 플래그(Bit Flag)이다.
비트 플래그(Bit Flag)란?
비트 플래그는 하나의 정수형 변수 안에 여러 개의 상태(ON/OFF)를 이진수의 각 비트 단위로 저장하는 방식이다.
즉, 한 비트(0 또는 1)가 하나의 상태를 의미하며, 여러 상태를 하나의 변수에 압축적으로 표현하고 동시에 관리할 수 있다.
예를 들어서, 다양한 속성을 지닌 탄환을 발사하는 게임을 구현한다고 가정해보자. 이 탄환은 적에게 둔화/기절/쉴드 파괴/화상 등 다양한 속성들을 중복 적용 시킬 수 있다.
먼저, 평범한 구조체로 상태를 관리할 때 어떤 일이 생기는지 알아보자.
public class EnemyStatus : MonoBehaviour
{
public bool isSlow;
public bool isStun;
public bool isShieldBreak;
public bool isBurn;
}
위 예시는 비트 플래그를 사용하지 않고, 각각의 상태를 bool 변수로 따로 관리하는 가장 기본적인 구조다. 이 방식은 단순해 보이지만, 게임 시스템이 확장될수록 문제가 명확해진다.
예를 들어, 적에게 걸릴 수 있는 상태가 둔화, 기절, 쉴드 파괴, 화상 뿐이라면 괜찮지만, 추후에 상태가 추가될 때마다 새로운 변수를 만들고, 기존 코드 곳곳에 if (새로운 상태) 같은 조건문을 추가해야 한다.
또한 상태가 중첩될 때의 처리가 복잡해진다. 예를 들어, 둔화와 기절이 동시에 걸렸을 때의 특수 효과를 구현하려면 다음과 같은 코드가 필요하다.
if (isSlow && isStun)
{
// 둔화 + 기절 중복 효과 처리
}
이런 조건문이 상태의 조합 수만큼 늘어나게 되고, 결국 상태가 많아질수록 코드의 가독성과 유지보수성이 급격히 떨어지게 된다.
즉, 단순한 bool 기반 구조는 초기에 구현하기는 쉽지만, 상태가 늘어나거나 조합 규칙이 복잡해질수록 관리 비용이 폭발적으로 증가한다.
이런 이유 때문에 bool 대신 비트 플래그(Bit Flag)를 사용해 “여러 상태를 한 변수로 묶어 관리”하는 방식이 더 효율적이라고 할 수 있다.
비트 플래그(Bit Flag)를 사용한 다중 상태 관리 예시
앞서 살펴본 bool 기반 구조는 상태가 늘어날수록 관리가 어려워졌지만, 비트 플래그(Bit Flag)를 사용하면 여러 상태를 하나의 변수로 깔끔하게 묶어 관리할 수 있다.
아래 예시는 StatusTag 열거형(enum)을 정의하고, 이를 활용해 적의 상태를 간결하게 제어하는 코드이다.
[System.Flags]
public enum StatusTag
{
None = 0, // 0000
Slow = 1 << 0, // 0001
Stun = 1 << 1, // 0010
ShieldBreak = 1 << 2, // 0100
Burn = 1 << 3 // 1000
}
public class EnemyStatus : MonoBehaviour
{
public StatusTag flags; // 여러 상태를 한 변수에 저장
void Start()
{
// 상태 추가
flags |= StatusTag.Slow;
flags |= StatusTag.Burn;
// 상태 확인
if ((flags & StatusTag.Burn) != 0)
Debug.Log("화상 상태 적용 중");
}
}
이처럼 비트 플래그를 사용하면
- 여러 상태를 한 변수(flags) 로 관리할 수 있고,
- 비트 연산자(|, &, ~) 를 통해 간단히 상태를 추가·확인·제거할 수 있다.
즉, 코드가 훨씬 간결해지고, 새로운 상태를 추가하더라도 기존 구조를 건드리지 않아도 되기 때문에 확장성과 유지보수성이 크게 향상된다.
'Unity' 카테고리의 다른 글
| [유니티] 더 나은 코드를 위해, 코드간의 결합도 낮추기 (0) | 2025.12.04 |
|---|---|
| [유니티] 설정창에서 소리 조절 기능 구현하기 (1) | 2025.10.26 |