유니티에서 자주 쓰는 패턴이란?

토토들·2026년 3월 5일

Unity에서 자주 사용하는 디자인 패턴 정리

Unity로 게임을 개발하다 보면 코드가 점점 복잡해집니다.
이럴 때 디자인 패턴을 활용하면 코드 구조를 훨씬 깔끔하게 유지할 수 있습니다.

이번 글에서는 Unity에서 자주 사용하는 4가지 패턴을 정리해보았습니다.

  • Singleton
  • Observer (Event)
  • State (FSM)
  • Object Pooling

1. 싱글톤 패턴 (Singleton)

"이 씬에서 대장은 나 하나뿐이야!"

개념

특정 클래스의 인스턴스가 하나만 존재하도록 보장하고
어디서든 접근할 수 있도록 하는 패턴입니다.

언제 사용하나

  • GameManager
  • SoundManager
  • DataManager
  • UIManager

게임 전체에서 하나만 존재해야 하는 시스템에 사용합니다.

핵심 코드 구조

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    void Awake()
    {
        if (Instance == null)
            Instance = this;
        else
            Destroy(gameObject);
    }
}

어디서든 다음과 같이 접근할 수 있습니다.

GameManager.Instance.StartGame();

주의점

싱글톤을 너무 많이 사용하면

  • 클래스 간 결합도가 높아지고
  • 유지보수가 어려워질 수 있습니다

2. 옵저버 패턴 (Observer / Event)

"나 상태 변했어! 관심 있는 애들은 알아서 반응해!"

개념

어떤 객체의 상태가 변하면
그 객체를 구독하고 있는 다른 객체들에게 자동으로 알림을 보내는 패턴입니다.

언제 사용하나

예를 들어 플레이어가 데미지를 입었을 때

  • 체력 UI 감소
  • 피격 사운드 재생
  • 화면 이펙트

같은 이벤트가 동시에 발생해야 할 때 사용합니다.

장점

플레이어 코드가

  • UI
  • 사운드
  • 이펙트

같은 시스템을 직접 알 필요가 없습니다.

단순히

"나 데미지 입었어"

라는 이벤트만 보내면 됩니다.

Unity 구현 방식

Unity에서는 보통

  • Action
  • delegate
  • UnityEvent

를 사용합니다.

예시

public static Action OnPlayerDamaged;

void TakeDamage()
{
    OnPlayerDamaged?.Invoke();
}

3. 상태 패턴 (State / FSM)

"지금은 공격 중이니까 이동은 못 해!"

개념

객체의 현재 상태에 따라 행동을 변경하는 패턴입니다.

복잡한 if-else 구조를 해결하는 데 매우 유용합니다.

언제 사용하나

  • 적 AI (순찰 → 추적 → 공격 → 사망)
  • 플레이어 상태 관리
  • NPC 행동 패턴

구조

State 인터페이스
   │
   ├ IdleState
   ├ RunState
   ├ AttackState
   └ DeadState

State 인터페이스

public interface IState
{
    void Enter();
    void Execute();
    void Exit();
}

상태 클래스 예시

public class IdleState : IState
{
    public void Enter() {}
    public void Execute() {}
    public void Exit() {}
}

장점

새로운 상태가 추가될 때

  • 기존 코드를 수정할 필요 없이
  • 새로운 State 클래스만 추가하면 됩니다

4. 오브젝트 풀링 (Object Pooling)

"버리지 말고 재활용하자!"

개념

객체를 Destroy하고 Instantiate하는 대신
미리 만들어 둔 객체를 재사용하는 방식입니다.

언제 사용하나

  • 총알
  • 파티클 효과
  • 몬스터 웨이브
  • 스킬 이펙트

왜 좋은가

Unity에서

  • Instantiate
  • Destroy

매우 비용이 큰 연산입니다.

이 과정에서

  • 메모리 할당
  • GC 발생

이 일어나면서 프레임 드랍이 발생할 수 있습니다.

Object Pooling을 사용하면 이 문제를 크게 줄일 수 있습니다.

동작 흐름

1. 게임 시작 시 총알 20개 생성

총알 20개 생성 → 비활성화

2. 총을 쏠 때

비활성화된 총알을 가져와 활성화합니다.

bullet.SetActive(true);

3. 총알이 벽에 맞으면

파괴하지 않고 다시 비활성화합니다.

bullet.SetActive(false);

이렇게 다시 Pool로 반환되어 재사용됩니다.


정리

패턴사용 목적
Singleton전역 관리 시스템
Observer이벤트 기반 시스템
State상태 기반 행동 제어
Object Pooling객체 재사용으로 성능 최적화

이러한 패턴들을 적절히 활용하면

  • 코드 구조가 깔끔해지고
  • 유지보수가 쉬워지며
  • 성능 문제도 줄일 수 있습니다.
profile
패션과 개발을 좋아합니다.

0개의 댓글