본문으로 건너뛰기

© 2026 Molayo

YouTube요약2026. 06. 15. 10:28

프로젝트 초기화 - Unity 아키텍처

요약

Unity 프로젝트에서 싱글톤 사용 시 발생하는 결합도 문제와 개발 워크플로우 저해를 해결하는 아키텍처 방법을 소개합니다. RuntimeInitializeOnLoadMethod를 활용하여 프리로드 씬 없이도 시스템 오브젝트를 자동으로 초기화하는 Bootstrapper 패턴을 제안합니다.

핵심 포인트

  • 싱글톤의 높은 결합도로 인해 특정 씬만 단독 실행하기 어려움
  • 프리로드 씬 방식은 개발 단계에서 작업 흐름을 끊는 번거로움이 있음
  • RuntimeInitializeOnLoadMethod를 사용하여 씬 로드 전 자동 초기화 구현
  • Systems 프리팹과 Bootstrapper 스크립트를 통한 효율적인 의존성 관리

비디오: 프로젝트 초기화 - Unity 아키텍처
채널: Tarodev
길이: 3분 20초
출처: 자막 (자동 생성, 영어)

스크립트:
안녕하세요 친구들, 오늘은 프로젝트 초기화 (Project Initialization)에 대해 이야기해보고자 합니다. 보통 프로젝트 초기화에 대해 이야기할 때는 아마 싱글톤 (Singletons)에 대해서도 함께 이야기하게 될 것입니다. 우리 모두 알다시피 싱글톤에는 장단점이 있습니다. 주요 단점 중 하나는 결합도가 높은 (Tightly coupled) 아키텍처를 만든다는 점입니다. 예를 들어, Player 프리팹 (Prefab)이 Input Manager와 Audio Manager에 의존하고 있다고 가정해 봅시다. 그러면 새로운 씬 (Scene)을 만들고 Player를 바로 씬에 배치한 뒤 재생 버튼을 누를 수 없습니다. 몇 가지 에러가 발생할 것이기 때문입니다.

사람들이 이를 완화하기 위해 보통 하는 방식은 프리로드 씬 (Preload scene)을 만드는 것입니다. 그 씬에 싱글톤들을 배치하고, 실제 사용하려는 씬을 불러오기 전에 항상 프리로드 씬을 먼저 로드하도록 보장하는 방식이죠. 그러면 의존성 (Dependencies)들이 항상 제대로 작동하는 상태가 됩니다. 빌드 (Build) 환경에서는 괜찮습니다. 빌드는 인덱스 0부터 순차적으로 실행되므로 항상 의존성들이 준비되어 있을 테니까요. 하지만 개발 (Development) 단계에서는 상당히 번거로운 일입니다. 정말 운이 나쁘면, 디버깅하고 싶은 특정 씬으로 가기 위해 매번 프리로드 씬으로 이동해서 재생 버튼을 눌러야 할 수도 있습니다.

더 나은 방법은 이와 같은 작은 스크립트를 작성하여, 스크립트가 프리로드 씬을 대신 로드한 다음 현재 씬을 로드하게 만드는 것입니다. 하지만 이 방식은 현재 메인 씬에서 벗어나게 된다는 문제가 있습니다. 저장하지 않은 변경 사항이 있다면 저장 여부를 묻는 창이 뜰 것이고, 작업 흐름 (Flow)이 끊기게 되어 상당히 짜증 나는 상황이 됩니다.

그래서 제가 어떻게 하는지 보여드리려고 합니다. 저는 이것이 가장 좋은 방법이라고 생각합니다. 여러분이 사용하는 다른 방식이나 더 낫다고 생각하는 방식, 혹은 이 방식의 변형된 형태가 있다면 댓글로 알려주시면 좋겠습니다. 우리가 할 일은 Systems라고 부를 빈 오브젝트를 만드는 것입니다. Main App 등 원하는 이름으로 부르셔도 됩니다.

여기 보시는 것처럼 저는 Audio Manager와 Input Manager라는 두 개의 싱글톤 (Singleton)을 가지고 있습니다. 저는 절대 파괴되지 않는 지속적인 매니저 (Persistent Managers)를 만들 때, 이들을 조금이라도 차별화하기 위해 'Systems'라고 부르는 것을 좋아합니다. 그래서 제 Systems 오브젝트 아래에 빈 Input Manager를 만들고, Audio Manager를 만든 다음, 이 스크립트들을 거기에 그냥 던져 넣겠습니다.

그다음 Systems의 프리팹 (Prefab)을 만들겠습니다. 만약 Addressables를 사용 중이라면 원하는 곳 어디든 배치할 수 있겠지만, 사용하지 않는다면 저렇게 Resources 폴더에 넣으시면 됩니다.

그리고 여기에 Bootstrapper라고 부를 스크립트를 만들겠습니다. Initializer나 Main 등 원하는 대로 이름을 붙이셔도 됩니다. 자, 이 녀석을 열어보죠. 이전에 코드를 미리 준비해 두었습니다. 여기 있습니다. 이것은 단순한 정적 클래스 (Static Class)이며, execute라는 하나의 메서드를 가지고 있습니다. 그리고 그 메서드에는 RuntimeInitializeOnLoadMethod 속성이 BeforeSceneLoad로 설정되어 있습니다. 즉, 어떤 씬이 로드되기 전이라도 이 함수를 실행하라는 뜻입니다. 제가 하는 일은 Resources에서 Systems 오브젝트를 인스턴스화 (Instantiating)하고, 거기에 DontDestroyOnLoad를 호출하는 것뿐입니다. 만약 Addressable 시스템을 사용 중이라면, Addressables 버전에 대해서도 코드를 올려두겠습니다. 매우 유사합니다.

이제 이 아주 적은 양의 코드만 있으면, 다시 게임으로 돌아가서 여기 있는 Systems를 삭제하고 재생(Play)을 눌러보겠습니다. 그러면 우리의 Systems가 두 개의 싱글톤과 함께 준비된 상태로 실행되는 것을 볼 수 있습니다. 정말로, 여러분이 DontDestroyOnLoad를 호출해야 하는 유일한 오브젝트는 이 Systems 오브젝트나 여러분이 부르는 그 이름의 오브젝트뿐입니다. 그리고 새로운 지속적인 매니저를 추가해야 할 때마다, 단순히 여기에 새로운 자식 (Child) 오브젝트를 추가하기만 하면 됩니다. 이 시스템의 묘미는 여전히 여기서 참조 (References)를 직렬화 (Serialize)할 수 있다는 점입니다. 예를 들어 Audio Source를 여기에 추가하거나, Mixer에 추가하는 등의 작업이 가능하죠. 정말 정말 쉽습니다.

그리고 맹세컨대, 쿼터니언 (Quaternions) 영상은 곧 올라옵니다. 계속 그렇게 말하고 있다는 건 저도 압니다만, 솔직히 시간이 정말 오래 걸리고 있습니다. 완성하기 위해 정말 열심히 노력하고 있습니다. 이번 주말에는 끝날 줄 알았는데 아니네요. 그럼 이것으로

안녕히 계세요, 사랑합니다. 다음에 만나요.
[Music]

AI 자동 생성 콘텐츠

본 콘텐츠는 YouTube Tarodev (Unity 팁)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0