겜언니의 게임개발

MonoBehaviour 없이도 구조를 짤 수 있다고? – 더 유연하고 가벼운 설계 방법

mag1128 2025. 6. 23. 17:39
반응형

 

모든 걸 MonoBehaviour로 짜면 구조가 무거워진다

Unity 프로젝트를 처음 짜면 모든 매니저를 MonoBehaviour 상속으로 만들기 쉽다.
하지만 프로젝트가 커질수록 의존성, 씬 간 연결, 참조 꼬임이 문제로 떠오른다.
MonoBehaviour를 최소화하고 비상속 구조로 관리하는 방식을 정리해본다.


1. 왜 MonoBehaviour 없이 짜려는가?

  • new로 생성 불가 → 항상 씬에 넣거나 Instantiate 필요
  • Awake()/Start() 시점 불확실 → 초기화 순서 꼬이기 쉬움
  • 씬 간 이동 시 DontDestroyOnLoad를 써야만 유지됨 → 오브젝트 난잡해짐
  • 디커플링이 어려움 → 단위 테스트, 독립적 재사용 불가

2. 대신 사용하는 구조: 정적 매니저 클래스

public static class GameDataManager {
    public static int Gold { get; set; }
    public static void Save() { ... }
}
  • 상태 유지가 목적일 때는 static 클래스가 간결하고 명확함
  • 단점: GC 누적, 상태가 꼬일 수 있으므로 단순 데이터/로직에 한정

3. 싱글턴 클래스를 new로 직접 관리

  • MonoBehaviour 상속 없이 new로 생성해서 관리
  • 생성 시점 명확하고 테스트도 용이함
public class SoundManager {
    public void Play(string clipName) { ... }
}

public class Game {
    private static SoundManager _sound = new SoundManager();
}

4. ScriptableObject 기반 전역 객체

  • 런타임 상태가 아닌, 에디터에서 설정하는 값에 적합
  • 주로 Config, Constant, 초기 설정값 등
  • MonoBehaviour 없이 에셋으로 접근 가능한 단위 정보를 만들 수 있음

5. 그럼 MonoBehaviour는 언제 쓰나?

  • Unity 엔진과 직접 연결되는 객체일 때:
    • 카메라, 렌더링, 콜리전, 트리거, UI 이벤트 등
  • **‘씬에 존재하는 물리적 객체’**에만 MonoBehaviour를 붙이는 방식으로 최소화

정리하며

MonoBehaviour는 강력하지만 제약이 많다.
기능 중심 로직은 비상속 구조로 설계하고,
Unity 엔진과 직접 연결된 컴포넌트만 MonoBehaviour로 분리하는 구조가 유지보수에 유리하다.

 

반응형