Unity 프로젝트 구조 설계 방법 [TIL 36일차]

장민제·2025년 6월 4일

내일배움캠프

목록 보기
38/41
post-thumbnail

효율적인 Unity 프로젝트 구조 설계에 대해 학습하고, 정리해보았다.
특히 유지보수성과 성능, 확장성 관점에서 중요한 요소들을 중심으로 정리하였다.


1. Enum & Struct 통합 관리

🔹 Enum의 장점

  • 자동완성 지원으로 오타를 줄이고 가독성을 향상
  • 상수 값보다 타입 안정성 확보
  • 코드 작성 시 값의 명확한 의미 부여

🔹 Struct의 장점

  • 값 타입으로 스택 메모리 활용, GC 부담 감소
  • 참조 공유로 인한 데이터 오염 방지
  • 직렬화가 가능하여 ScriptableObject나 JSON 등에 활용하기 유리

Enum과 Struct는 하나의 파일에서 모아서 관리하는 것이 유지보수에 효과적


2. 유틸리티 함수 & 글로벌 상수 관리

🔹 유틸리티 함수 (static class)

  • 중복 제거와 재사용성 강화
  • 어디서든 접근 가능하여 간단한 기능 처리에 유리
  • 주의: 남용 시 의존성 증가 가능성

🔹 글로벌 상수

  • public static readonly 또는 const를 활용하여 불변값만 전역 관리
  • 예: Tag, Layer, 서버 주소, 씬 이름, UI 키 값 등

3. 싱글톤 + DontDestroyOnLoad 패턴

  • 게임 전반에 걸쳐 유지되어야 하는 객체 (예: GameManager, AudioManager 등)에 사용
  • DontDestroyOnLoad(this.gameObject)로 씬 전환에도 유지

남용 시 결합도 증가와 디버깅 난이도 상승

Generic 싱글톤

using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                // 해당 컴포넌트를 가지고 있는 게임 오브젝트 반환
                instance = (T)FindAnyObjectByType(typeof(T));

                if (instance == null)
                {
                    // 새로운 게임 오브젝트 생성 및 컴포넌트 추가
                    GameObject obj = new GameObject(typeof(T).Name, typeof(T));
                    // 새로운 오브젝트의 컴포넌트 인스턴스에 지정
                    instance = obj.GetComponent<T>();
                }
            }

            return instance;
        }
    }

    protected virtual void Awake()
    {
        // 인스턴스가 없을 때 해당 오브젝트로 설정
        if (instance == null)
        {
            instance = this as T;
            DontDestroyOnLoad(this.gameObject);
        }

        // 인스턴스가 존재한다면 현재 오브젝트 파괴
        else if (instance != null)
            Destroy(gameObject);
    }
}

4. ScriptableObject & 데이터 컨테이너

🔹 ScriptableObject

  • 설정 값, 능력치, 아이템 데이터 등 불변 데이터 관리에 최적
  • 인스펙터에서 관리 가능하며, 에디터 친화적

🔹 데이터 컨테이너

  • 여러 ScriptableObject를 하나의 큰 묶음으로 관리
  • 예: StageDataList, ItemDatabase

메모리 절약을 위해 불필요한 데이터까지 함께 로드하지 않도록 설계


5. 리소스 및 오브젝트 풀링

🔹 리소스 그룹화

  • 사운드, 이펙트, 아이콘 등을 ScriptableObjectDictionary 등으로 묶어 중앙 집중식 관리

🔹 오브젝트 풀링

  • 자주 생성/파괴되는 오브젝트는 Pool로 관리하여 GC 호출 방지 및 성능 최적화

6. 씬 & UI 관리

🔹 멀티 씬 구조

  • UI, 월드, 매니저 등을 독립적인 씬으로 분리하면 모듈화와 로딩 최적화에 유리

🔹 UI 최적화

  • 변경이 잦은 UI는 Canvas 분리

EventTrigger보다 UnityEvent, AddListener 사용 권장


😁 느낀점

이번 정리를 통해 프로젝트 구조의 중요성을 다시금 깨달았다. 더 체계적으로 설계하고, 유지보수성확장성을 고려한 개발 습관을 만들어나가는 방향으로 공부해야겠다.

profile
Unity, C#

0개의 댓글