무엇을 찾고 계신가요?
Hero background image
Unity 스크립터블 오브젝트 데모 시작하기

이 페이지에서는 다음에 대한 개요를 제공합니다. 패들볼소전자책의 동반 데모 프로젝트에 대한 개요를 제공합니다. 스크립터블 오브젝트로 Unity에서 모듈식 게임 아키텍처 만들기를 소개하고 코드 아키텍처에서 디자인 패턴과 모듈성을 사용하는 방법을 설명합니다.

이 가이드는 전자책과 함께 제공되는 데모로 Unity 개발자를 지원하기 위해 제작된 6개의 미니 가이드 시리즈 중 첫 번째 가이드입니다. 이 데모는 고전적인 공과 패들 아케이드 게임 메커니즘에서 영감을 얻은 것으로, 스크립터블 오브젝트가 테스트 가능하고 확장 가능하며 디자이너 친화적인 컴포넌트를 만드는 데 어떻게 도움이 되는지 보여줍니다.

전자책, 데모 프로젝트, 이 미니 가이드는 Unity 프로젝트에서 스크립터블 오브젝트 클래스와 함께 프로그래밍 디자인 패턴을 사용하기 위한 모범 사례를 제공합니다. 이러한 팁은 코드를 간소화하고 메모리 사용량을 줄이며 코드 재사용성을 높이는 데 도움이 될 수 있습니다.

이 시리즈에는 다음 문서가 포함되어 있습니다:

시작하기 전 중요 참고 사항

스크립터블 오브젝트 데모 프로젝트와 이 미니 가이드 시리즈를 살펴보기 전에 디자인 패턴의 핵심은 아이디어에 불과하다는 점을 기억하세요. 모든 상황에 적용되지는 않습니다. 이러한 기술을 통해 Unity 및 스크립터블 오브젝트로 작업하는 새로운 방법을 배울 수 있습니다.

각 패턴에는 장단점이 있습니다. 특정 프로젝트에 의미 있게 도움이 되는 것만 선택하세요. 디자이너가 Unity 에디터에 크게 의존하고 있나요? 스크립터블오브젝트 기반 패턴은 개발자와의 협업을 돕는 좋은 선택이 될 수 있습니다.

궁극적으로 가장 좋은 코드 아키텍처는 프로젝트와 팀에 맞는 아키텍처입니다.

paddleball
패들 볼 스크립터블 오브젝트 프로젝트

패들볼소는 현대 비디오 게임을 탄생시킨 고전 게임으로, 두 명의 플레이어와 두 개의 패들, 공이 등장합니다.

여기서는 게임 메커니즘보다는 인프라에 중점을 둡니다. 이를 '게임 배관'이라고 생각하면, 화려하지는 않지만 애플리케이션을 계속 실행하는 데 매우 중요한 기반이 됩니다.

이 프로젝트는 스크립터블 객체가 통합 애플리케이션을 구축하기 위해 백그라운드에서 어떻게 작동하는지에 중점을 둡니다. 이를 사용하여 프로젝트 유지 관리를 간소화하고 코드 재사용성을 높일 수 있는 다목적 게임 시스템을 구축할 수 있습니다. 플레이어 데이터, 게임 상태 관리, 게임 내 행동 등에도 사용할 수 있습니다.

패들볼소 프로젝트는 최신 버전의 Unity 장기 지원(LTS, 현재 2022 LTS)과 호환됩니다. 런타임 UI 제작을 위한 UI 툴킷과 사용자 입력을 처리하는 입력 시스템이 통합되어 있습니다.

부트로더
시작하기

GitHub 리포지토리에서 프로젝트를 찾아 다운로드합니다.

부트로더_씬을 로드하거나 게임 시스템 메뉴에서 플레이 시 부트스트랩 씬 로드를 활성화합니다. 시작하려면 재생 모드로 들어갑니다.

스크립터블 오브젝트에만 적용되는 것은 아니지만 데모 프로젝트에서는 몇 가지 일반적인 기술을 사용하여 일관되고 예측 가능한 상태로 게임 애플리케이션을 시작할 수 있습니다.

부트스트래퍼 (또는 부트로더)는 게임의 초기 상태 설정을 담당하는 에디터 확장 스크립트입니다. 이 초기화 코드는 게임 로직과 분리되어 있으며 씬의 오브젝트에 대한 모든 종속성이 올바르게 설정되었는지 확인합니다.

종속성 문제를 방지하기 위해 부트스트래퍼는 씬이 로드될 때 필수 게임 오브젝트, 매니저 또는 서비스를 구성합니다.

Unity 애플리케이션이 여러 씬에 걸쳐 있는 경우 부트로더는 빌드 설정에서 첫 번째 씬인 특정 부트스트랩 씬을 강제로 로드할 수 있습니다. 재생 모드를 종료하면 편집기에서 이전 장면을 다시 로드합니다.

그러면 부트스트랩 씬의 또 다른 컴포넌트인 시퀀스 매니저가 씬 로드 시 필수 프리팹을 인스턴스화할 수 있습니다. 이 특정 데모 프로젝트에서는 카메라, 스플래시스크린, UI 메뉴, 씬로더 등 게임 제작에 필요한 모든 것이 프리팹으로 제공됩니다.

그런 다음 씬로더는 필요에 따라 게임플레이 씬을 추가적으로 로드(및 언로드)합니다. 대부분의 경우 이러한 장면은 주로 프리팹으로 구성됩니다.

프로젝트 장면

각 미니 게임 레벨은 별도의 Unity 씬이며 빌드 설정에 나타납니다. 개별 씬을 탐색하려면 게임 시스템 메뉴에서 SceneBootstrapper를 비활성화합니다.

많은 프로젝트에는 부트스트랩 장면 뒤에 메인 메뉴를 위한 스테이징 영역이 포함되어 있습니다. 이 간소화된 데모 프로젝트에서는 메인 메뉴 장면이 생략되었습니다.

tab5
패들볼소 프로젝트 개요

플레이패턴 메뉴를 사용하여 패들볼소를 테스트할 수 있습니다:

  • 특정 기술을 보여주고 각 패턴을 개별적으로 설명하는 디자인 패턴 데모 또는 한입 크기의 예제
  • 이를 기능적이고 작동하는 샘플로 결합한 미니 게임

코어 폴더에는 기본 패턴 스크립트, 장면 관리 및 UI 로직과 같이 애플리케이션과 관련이 없는 코드 베이스의 일부가 포함되어 있습니다. 다양한 애플리케이션에 적용할 수 있는 보다 일반적인 클래스입니다.

tab10
패턴 및 미니 게임 살펴보기

이 샘플 게임은 상징적인 2D 물리 시뮬레이션을 재현하고 스크립터블 오브젝트 기반 디자인 패턴의 잠재력을 보여줍니다.

하지만 패턴을 살펴보기 전에 애플리케이션을 구성하는 모노비헤이비어에 익숙해지는 것이 좋습니다. 예상할 수 있듯이 패들, 공, 바운서, 스코어골 스크립트와 같은 컴포넌트가 기본 게임플레이를 관리합니다.

여러 상위 관리자 스크립트가 게임 흐름을 제어합니다:

  • 게임 매니저는 게임 상태(시작, 종료, 리셋)를 제어하고, 게임 컴포넌트를 초기화하고, UI를 관리하고, 이벤트에 응답합니다.
  • 게임 설정 은 게임 매니저와 연동하여 공, 패들, 벽, 골대를 설정합니다.
  • 점수 관리자는 점수 값을 업데이트하고, 게임 이벤트를 처리하며, 점수 표시를 위한 UI 업데이트를 제어합니다.

이러한 모노비헤이비어는 스크립터블 오브젝트와 함께 작동합니다. 이러한 구성 요소들이 서로 대화하고 데이터를 공유할 수 있도록 연결하는 데 중요한 역할을 합니다.

이벤트는 프로젝트의 여러 부분 간의 커뮤니케이션에 중요한 역할을 합니다. 이러한 관리자 스크립트는 다른 씬 오브젝트 및 사용자 인터페이스와 연결됩니다. 이 이벤트 중심 아키텍처는 코드를 보다 체계적이고 디버깅하기 쉽게 만드는 데 도움이 됩니다.

또한 가장 일반적인 스크립터블 객체 패턴 각각에 대한 간단한 데모 예제도 제공했습니다. 스크립터블 오브젝트에 익숙해지면 미니게임의 아키텍처를 뒷받침하는 스크립터블 오브젝트가 어떻게 작동하는지 알아차릴 수 있습니다.

훨씬 적은 코드 줄로 기능적인 미니 게임을 만들 수도 있었지만 이 데모는 특히 스크립터블 오브젝트를 사용한 디자인 패턴에 초점을 맞췄습니다. 스크립터블 오브젝트 없이도 이러한 패턴 중 상당수를 구현할 수 있다는 점에 유의하세요.

팀과 함께 각 패턴을 프로젝트에 어떻게 적용할지 결정하고 가장 적합한 접근 방식을 선택하세요.

tanb22
모듈식 게임 아키텍처

소프트웨어 개발에서 모듈화는 애플리케이션을 더 작고 독립적인 조각으로 나누는 것을 의미합니다. 이러한 모듈은 특정 목적을 위해 사용되며 별도로 개발 및 테스트할 수 있습니다.

각각의 작은 오브젝트 세트는 하나의 단위로 작동하며 게임의 한 측면을 처리합니다. 여기에는 플레이어 입력 제어, 물리 처리, 점수 집계 등 모든 것이 포함될 수 있습니다.

프로젝트 스크립트를 살펴볼 때 다음과 같은 주요 사항에 주의하세요:

  • 프리팹으로 씬을 구성하세요: 프로젝트의 대부분의 씬은 최소한의 오버라이드가 있는 프리팹의 모음일 뿐이라는 것을 알 수 있습니다. 프리팹은 본질적으로 모듈화 수준을 제공합니다. 기능의 문제를 해결하려면 해당 프리팹을 개별적으로 테스트해야 합니다. 프리팹은 스크립터블 오브젝트와 마찬가지로 여러 씬에서 재사용하고 공유할 수 있는 프로젝트 수준 에셋입니다.
  • 스크립터블 객체를 사용하여 데이터 저장(및 기타)을 하세요: 모노비헤이비어를 사용하여 정적 게임플레이 데이터를 저장하지 마세요. 대신 스크립터블 오브젝트를 활용하여 재사용성을 높이세요. 특정 게임 로직을 스크립터블 오브젝트로 전환하거나 씬 오브젝트 간의 통신을 원활하게 하도록 할 수도 있습니다.
  • 걱정거리를 분리하세요: 프로젝트에서 데이터, 로직, 사용자 인터페이스를 명확하게 구분하세요. 이렇게 하면 코드 유지 관리가 향상되고 디버깅이 간소화됩니다. 메뉴 화면 시스템은 최신 UI 툴킷을 활용합니다. 이 UI 시스템은 인터페이스를 기본 로직과 분리하는 워크플로우를 적용합니다. 자세한 내용은 Unity에서 사용자 인터페이스 디자인 및 구현 전자책을 확인하세요.
  • 종속성을 최소화하세요: 컴포넌트 간의 종속성을 줄이면 예상치 못한 문제를 일으키지 않고 프로젝트의 일부를 수정하거나 교체하기가 더 쉬워집니다.
  • 커뮤니케이션에 이벤트를 사용하세요: 이벤트는 컴포넌트 간의 느슨한 결합을 가능하게 하여 직접적인 종속성 없이 서로에게 메시지를 보낼 수 있도록 합니다. 스크립터블오브젝트 기반 "이벤트 채널"을 사용하여 더 분리할 수 있습니다.
  • 불필요한 싱글톤을 피하세요: 싱글톤 디자인 패턴은 유용할 수 있지만 클래스의 단일 인스턴스가 필수적인 경우에만 유용합니다. 싱글톤을 과도하게 사용하면 코드가 긴밀하게 결합되어 테스트에 방해가 될 수 있습니다. 싱글톤이 필요하지 않은 경우 건너뛰세요.

큰 모놀리식 스크립트를 작은 조각으로 리팩토링하면 재사용성과 확장성이 향상됩니다. 이를 통해 팀 협업이 개선되고 테스트가 간소화됩니다.

디자인 패턴
스크립터블 객체 작업 중

스크립터블오브젝트 사용 사례를 보여드리기 위해 패들볼소 프로젝트를 만들었습니다. 다음은 실제로 작동하는 몇 가지 구체적인 장소입니다:

  • 게임데이터소 스크립터블 오브젝트는 게임 설정을 위한 중앙 데이터 컨테이너 역할을 합니다. 공통 데이터를 한 번 편집한 다음 이를 필요로 하는 다른 개체와 공유하세요.
  • 미니 게임은 수많은 이벤트 채널에 의존하여 분리된 방식으로 소통합니다. 이러한 스크립터블 오브젝트 기반 이벤트는 오브젝트가 서로 메시지를 보내는 방법의 중추를 형성합니다.
  • 사운드 재생은 스크립터블 오브젝트 기반 델리게이트 오브젝트를 사용하여 모노비헤이비어 컴포넌트에서 로직을 분리합니다.
  • PlayerIDSO 스크립터블 오브젝트 기반 열거형을 사용하여 Player1과 Player2를 '팀'으로 구분합니다.
  • 레벨 레이아웃소 스크립터블 오브젝트는 패들, 골대, 벽, 공과 같은 게임 요소의 시작 위치에 대한 데이터 컨테이너 역할을 합니다. 이를 통해 Unity 내에서 레벨 레이아웃을 쉽게 수정할 수 있으며, 외부에서 익스포트된 JSON 파일을 통해 레벨 레이아웃을 쉽게 수정할 수 있습니다. Unity 외부에서 레벨 디자인을 모딩하면 플레이어의 창의성과 커스텀 레이아웃 공유를 장려할 수 있습니다.

디자인 패턴 데모에서 몇 가지 추가 기능도 확인해 보세요!

parcelbox
스크립터블 객체를 위한 6가지 모범 사례

스크립터블 오브젝트는 게임 데이터를 저장하고 워크플로를 간소화하는 강력한 도구가 될 수 있지만, 프로젝트가 복잡해지지 않도록 효과적으로 사용하는 것이 중요합니다.

다음은 Unity에서 스크립터블 오브젝트를 사용하기 위한 몇 가지 모범 사례입니다:

  • 데이터를 모듈식으로 체계적으로 관리하세요: 서로 다른 데이터 유형(예: 플레이어 통계용, 적 행동용 등)에 대해 별도의 스크립터블 오브젝트를 사용합니다. 복잡한 데이터를 쉽게 관리할 수 있는 작은 조각으로 나누세요.
  • 폴더 및 이름 지정 규칙을 사용합니다: 스크립터블 오브젝트를 사용하면 스크립트의 코드를 줄일 수 있지만 프로젝트 폴더에서 더 많은 에셋을 처리해야 한다는 단점이 있습니다. 적절한 이름 지정과 디렉터리 구성은 이러한 스크립터블 객체를 효율적으로 관리하는 데 도움이 됩니다. 이름 지정에 대한 팁은 코드 스타일 가이드를 확인하세요.
  • 스크립터블 오브젝트를 과도하게 사용하지 마세요: 스크립터블 객체는 훌륭한 데이터 컨테이너이지만, 이를 과도하게 사용하지 않는 것이 중요합니다. 스크립터블 오브젝트는 프로젝트에 복잡성을 더할 수 있으므로 명확한 이점을 제공하는 경우에만 배포하세요. (예를 들어 영구 데이터를 저장하는 데 사용하지 마세요.)
  • 데이터를 정기적으로 백업하세요: 스크립터블 오브젝트에 대한 변경 사항은 런타임에 '실시간으로' 발생하며 에셋 파일로 저장됩니다. 데이터 손실을 방지하기 위해 프로젝트를 정기적으로 백업하세요. 버전 관리 소프트웨어를 사용하여 스크립터블 객체의 변경 사항을 추적하세요.
  • 인스펙터 창을 사용합니다: 스크립터블 오브젝트의 주요 장점 중 하나는 직렬화할 수 있고 인스펙터에 표시된다는 점입니다. 에디터 인터페이스를 활용하여 스크립터블 오브젝트에 저장된 데이터를 보고 조작할 수 있습니다.
  • 사용자 지정 편집기 스크립트를 유용하게 사용하세요: 스크립터블 오브젝트는 기본적으로 씬 계층구조에서 런타임 오브젝트를 참조할 수 없습니다. 이러한 개체를 시각화해야 하는 경우 에디터 스크립팅을 사용하여 인스펙터를 보다 사용자 친화적인 인터페이스로 만들 수 있습니다.

이 가이드라인을 따르면 일반적인 개발 함정을 피할 수 있습니다.

스크립트 가능한 아웃트로
스크립터블 오브젝트 리소스 추가

스크립터블 오브젝트를 사용한 디자인 패턴에 대한 자세한 내용은 스크립터블 오브젝트를 사용하여 Unity에서 모듈식 게임 아키텍처 만들기 전자책에서 확인할 수 있습니다. 게임 프로그래밍 패턴으로 코드 레벨 업 전자책에서 일반적인 Unity 개발 디자인 패턴에 대한 자세한 내용을 확인할 수도 있습니다.

이 콘텐츠가 마음에 드셨나요?