이 페이지에서는 다음에 대한 개요를 제공합니다. 패들볼소전자책의 동반 데모 프로젝트에 대한 개요를 제공합니다. 스크립터블 오브젝트로 Unity에서 모듈식 게임 아키텍처 만들기를 소개하고 코드 아키텍처에서 디자인 패턴과 모듈성을 사용하는 방법을 설명합니다.
이 가이드는 전자책과 함께 제공되는 데모로 Unity 개발자를 지원하기 위해 제작된 6개의 미니 가이드 시리즈 중 첫 번째 가이드입니다. 이 데모는 고전적인 공과 패들 아케이드 게임 메커니즘에서 영감을 얻은 것으로, 스크립터블 오브젝트가 테스트 가능하고 확장 가능하며 디자이너 친화적인 컴포넌트를 만드는 데 어떻게 도움이 되는지 보여줍니다.
전자책, 데모 프로젝트, 이 미니 가이드는 Unity 프로젝트에서 스크립터블 오브젝트 클래스와 함께 프로그래밍 디자인 패턴을 사용하기 위한 모범 사례를 제공합니다. 이러한 팁은 코드를 간소화하고 메모리 사용량을 줄이며 코드 재사용성을 높이는 데 도움이 될 수 있습니다.
이 시리즈에는 다음 문서가 포함되어 있습니다:
스크립터블 오브젝트 데모 프로젝트와 이 미니 가이드 시리즈를 살펴보기 전에 디자인 패턴의 핵심은 아이디어에 불과하다는 점을 기억하세요. 모든 상황에 적용되지는 않습니다. 이러한 기술을 통해 Unity 및 스크립터블 오브젝트로 작업하는 새로운 방법을 배울 수 있습니다.
각 패턴에는 장단점이 있습니다. 특정 프로젝트에 의미 있게 도움이 되는 것만 선택하세요. 디자이너가 Unity 에디터에 크게 의존하고 있나요? 스크립터블오브젝트 기반 패턴은 개발자와의 협업을 돕는 좋은 선택이 될 수 있습니다.
궁극적으로 가장 좋은 코드 아키텍처는 프로젝트와 팀에 맞는 아키텍처입니다.
패들볼소는 현대 비디오 게임을 탄생시킨 고전 게임으로, 두 명의 플레이어와 두 개의 패들, 공이 등장합니다.
여기서는 게임 메커니즘보다는 인프라에 중점을 둡니다. 이를 '게임 배관'이라고 생각하면, 화려하지는 않지만 애플리케이션을 계속 실행하는 데 매우 중요한 기반이 됩니다.
이 프로젝트는 스크립터블 객체가 통합 애플리케이션을 구축하기 위해 백그라운드에서 어떻게 작동하는지에 중점을 둡니다. 이를 사용하여 프로젝트 유지 관리를 간소화하고 코드 재사용성을 높일 수 있는 다목적 게임 시스템을 구축할 수 있습니다. 플레이어 데이터, 게임 상태 관리, 게임 내 행동 등에도 사용할 수 있습니다.
패들볼소 프로젝트는 최신 버전의 Unity 장기 지원(LTS, 현재 2022 LTS)과 호환됩니다. 런타임 UI 제작을 위한 UI 툴킷과 사용자 입력을 처리하는 입력 시스템이 통합되어 있습니다.
GitHub 리포지토리에서 프로젝트를 찾아 다운로드합니다.
부트로더_씬을 로드하거나 게임 시스템 메뉴에서 플레이 시 부트스트랩 씬 로드를 활성화합니다. 시작하려면 재생 모드로 들어갑니다.
스크립터블 오브젝트에만 적용되는 것은 아니지만 데모 프로젝트에서는 몇 가지 일반적인 기술을 사용하여 일관되고 예측 가능한 상태로 게임 애플리케이션을 시작할 수 있습니다.
씬 부트스트래퍼 (또는 부트로더)는 게임의 초기 상태 설정을 담당하는 에디터 확장 스크립트입니다. 이 초기화 코드는 게임 로직과 분리되어 있으며 씬의 오브젝트에 대한 모든 종속성이 올바르게 설정되었는지 확인합니다.
종속성 문제를 방지하기 위해 부트스트래퍼는 씬이 로드될 때 필수 게임 오브젝트, 매니저 또는 서비스를 구성합니다.
Unity 애플리케이션이 여러 씬에 걸쳐 있는 경우 부트로더는 빌드 설정에서 첫 번째 씬인 특정 부트스트랩 씬을 강제로 로드할 수 있습니다. 재생 모드를 종료하면 편집기에서 이전 장면을 다시 로드합니다.
그러면 부트스트랩 씬의 또 다른 컴포넌트인 시퀀스 매니저가 씬 로드 시 필수 프리팹을 인스턴스화할 수 있습니다. 이 특정 데모 프로젝트에서는 카메라, 스플래시스크린, UI 메뉴, 씬로더 등 게임 제작에 필요한 모든 것이 프리팹으로 제공됩니다.
그런 다음 씬로더는 필요에 따라 게임플레이 씬을 추가적으로 로드(및 언로드)합니다. 대부분의 경우 이러한 장면은 주로 프리팹으로 구성됩니다.
프로젝트 장면
각 미니 게임 레벨은 별도의 Unity 씬이며 빌드 설정에 나타납니다. 개별 씬을 탐색하려면 게임 시스템 메뉴에서 SceneBootstrapper를 비활성화합니다.
많은 프로젝트에는 부트스트랩 장면 뒤에 메인 메뉴를 위한 스테이징 영역이 포함되어 있습니다. 이 간소화된 데모 프로젝트에서는 메인 메뉴 장면이 생략되었습니다.
플레이 및 패턴 메뉴를 사용하여 패들볼소를 테스트할 수 있습니다:
- 특정 기술을 보여주고 각 패턴을 개별적으로 설명하는 디자인 패턴 데모 또는 한입 크기의 예제
- 이를 기능적이고 작동하는 샘플로 결합한 미니 게임
코어 폴더에는 기본 패턴 스크립트, 장면 관리 및 UI 로직과 같이 애플리케이션과 관련이 없는 코드 베이스의 일부가 포함되어 있습니다. 다양한 애플리케이션에 적용할 수 있는 보다 일반적인 클래스입니다.
이 샘플 게임은 상징적인 2D 물리 시뮬레이션을 재현하고 스크립터블 오브젝트 기반 디자인 패턴의 잠재력을 보여줍니다.
하지만 패턴을 살펴보기 전에 애플리케이션을 구성하는 모노비헤이비어에 익숙해지는 것이 좋습니다. 예상할 수 있듯이 패들, 공, 바운서, 스코어골 스크립트와 같은 컴포넌트가 기본 게임플레이를 관리합니다.
여러 상위 관리자 스크립트가 게임 흐름을 제어합니다:
- 게임 매니저는 게임 상태(시작, 종료, 리셋)를 제어하고, 게임 컴포넌트를 초기화하고, UI를 관리하고, 이벤트에 응답합니다.
- 게임 설정 은 게임 매니저와 연동하여 공, 패들, 벽, 골대를 설정합니다.
- 점수 관리자는 점수 값을 업데이트하고, 게임 이벤트를 처리하며, 점수 표시를 위한 UI 업데이트를 제어합니다.
이러한 모노비헤이비어는 스크립터블 오브젝트와 함께 작동합니다. 이러한 구성 요소들이 서로 대화하고 데이터를 공유할 수 있도록 연결하는 데 중요한 역할을 합니다.
이벤트는 프로젝트의 여러 부분 간의 커뮤니케이션에 중요한 역할을 합니다. 이러한 관리자 스크립트는 다른 씬 오브젝트 및 사용자 인터페이스와 연결됩니다. 이 이벤트 중심 아키텍처는 코드를 보다 체계적이고 디버깅하기 쉽게 만드는 데 도움이 됩니다.
또한 가장 일반적인 스크립터블 객체 패턴 각각에 대한 간단한 데모 예제도 제공했습니다. 스크립터블 오브젝트에 익숙해지면 미니게임의 아키텍처를 뒷받침하는 스크립터블 오브젝트가 어떻게 작동하는지 알아차릴 수 있습니다.
훨씬 적은 코드 줄로 기능적인 미니 게임을 만들 수도 있었지만 이 데모는 특히 스크립터블 오브젝트를 사용한 디자인 패턴에 초점을 맞췄습니다. 스크립터블 오브젝트 없이도 이러한 패턴 중 상당수를 구현할 수 있다는 점에 유의하세요.
팀과 함께 각 패턴을 프로젝트에 어떻게 적용할지 결정하고 가장 적합한 접근 방식을 선택하세요.
소프트웨어 개발에서 모듈화는 애플리케이션을 더 작고 독립적인 조각으로 나누는 것을 의미합니다. 이러한 모듈은 특정 목적을 위해 사용되며 별도로 개발 및 테스트할 수 있습니다.
각각의 작은 오브젝트 세트는 하나의 단위로 작동하며 게임의 한 측면을 처리합니다. 여기에는 플레이어 입력 제어, 물리 처리, 점수 집계 등 모든 것이 포함될 수 있습니다.
프로젝트 스크립트를 살펴볼 때 다음과 같은 주요 사항에 주의하세요:
- 프리팹으로 씬을 구성하세요: 프로젝트의 대부분의 씬은 최소한의 오버라이드가 있는 프리팹의 모음일 뿐이라는 것을 알 수 있습니다. 프리팹은 본질적으로 모듈화 수준을 제공합니다. 기능의 문제를 해결하려면 해당 프리팹을 개별적으로 테스트해야 합니다. 프리팹은 스크립터블 오브젝트와 마찬가지로 여러 씬에서 재사용하고 공유할 수 있는 프로젝트 수준 에셋입니다.
- 스크립터블 객체를 사용하여 데이터 저장(및 기타)을 하세요: 모노비헤이비어를 사용하여 정적 게임플레이 데이터를 저장하지 마세요. 대신 스크립터블 오브젝트를 활용하여 재사용성을 높이세요. 특정 게임 로직을 스크립터블 오브젝트로 전환하거나 씬 오브젝트 간의 통신을 원활하게 하도록 할 수도 있습니다.
- 걱정거리를 분리하세요: 프로젝트에서 데이터, 로직, 사용자 인터페이스를 명확하게 구분하세요. 이렇게 하면 코드 유지 관리가 향상되고 디버깅이 간소화됩니다. 메뉴 화면 시스템은 최신 UI 툴킷을 활용합니다. 이 UI 시스템은 인터페이스를 기본 로직과 분리하는 워크플로우를 적용합니다. 자세한 내용은 Unity에서 사용자 인터페이스 디자인 및 구현 전자책을 확인하세요.
- 종속성을 최소화하세요: 컴포넌트 간의 종속성을 줄이면 예상치 못한 문제를 일으키지 않고 프로젝트의 일부를 수정하거나 교체하기가 더 쉬워집니다.
- 커뮤니케이션에 이벤트를 사용하세요: 이벤트는 컴포넌트 간의 느슨한 결합을 가능하게 하여 직접적인 종속성 없이 서로에게 메시지를 보낼 수 있도록 합니다. 스크립터블오브젝트 기반 "이벤트 채널"을 사용하여 더 분리할 수 있습니다.
- 불필요한 싱글톤을 피하세요: 싱글톤 디자인 패턴은 유용할 수 있지만 클래스의 단일 인스턴스가 필수적인 경우에만 유용합니다. 싱글톤을 과도하게 사용하면 코드가 긴밀하게 결합되어 테스트에 방해가 될 수 있습니다. 싱글톤이 필요하지 않은 경우 건너뛰세요.
큰 모놀리식 스크립트를 작은 조각으로 리팩토링하면 재사용성과 확장성이 향상됩니다. 이를 통해 팀 협업이 개선되고 테스트가 간소화됩니다.
스크립터블오브젝트 사용 사례를 보여드리기 위해 패들볼소 프로젝트를 만들었습니다. 다음은 실제로 작동하는 몇 가지 구체적인 장소입니다:
- 게임데이터소 스크립터블 오브젝트는 게임 설정을 위한 중앙 데이터 컨테이너 역할을 합니다. 공통 데이터를 한 번 편집한 다음 이를 필요로 하는 다른 개체와 공유하세요.
- 미니 게임은 수많은 이벤트 채널에 의존하여 분리된 방식으로 소통합니다. 이러한 스크립터블 오브젝트 기반 이벤트는 오브젝트가 서로 메시지를 보내는 방법의 중추를 형성합니다.
- 사운드 재생은 스크립터블 오브젝트 기반 델리게이트 오브젝트를 사용하여 모노비헤이비어 컴포넌트에서 로직을 분리합니다.
- PlayerIDSO 스크립터블 오브젝트 기반 열거형을 사용하여 Player1과 Player2를 '팀'으로 구분합니다.
- 레벨 레이아웃소 스크립터블 오브젝트는 패들, 골대, 벽, 공과 같은 게임 요소의 시작 위치에 대한 데이터 컨테이너 역할을 합니다. 이를 통해 Unity 내에서 레벨 레이아웃을 쉽게 수정할 수 있으며, 외부에서 익스포트된 JSON 파일을 통해 레벨 레이아웃을 쉽게 수정할 수 있습니다. Unity 외부에서 레벨 디자인을 모딩하면 플레이어의 창의성과 커스텀 레이아웃 공유를 장려할 수 있습니다.
디자인 패턴 데모에서 몇 가지 추가 기능도 확인해 보세요!
스크립터블 오브젝트는 게임 데이터를 저장하고 워크플로를 간소화하는 강력한 도구가 될 수 있지만, 프로젝트가 복잡해지지 않도록 효과적으로 사용하는 것이 중요합니다.
다음은 Unity에서 스크립터블 오브젝트를 사용하기 위한 몇 가지 모범 사례입니다:
- 데이터를 모듈식으로 체계적으로 관리하세요: 서로 다른 데이터 유형(예: 플레이어 통계용, 적 행동용 등)에 대해 별도의 스크립터블 오브젝트를 사용합니다. 복잡한 데이터를 쉽게 관리할 수 있는 작은 조각으로 나누세요.
- 폴더 및 이름 지정 규칙을 사용합니다: 스크립터블 오브젝트를 사용하면 스크립트의 코드를 줄일 수 있지만 프로젝트 폴더에서 더 많은 에셋을 처리해야 한다는 단점이 있습니다. 적절한 이름 지정과 디렉터리 구성은 이러한 스크립터블 객체를 효율적으로 관리하는 데 도움이 됩니다. 이름 지정에 대한 팁은 코드 스타일 가이드를 확인하세요.
- 스크립터블 오브젝트를 과도하게 사용하지 마세요: 스크립터블 객체는 훌륭한 데이터 컨테이너이지만, 이를 과도하게 사용하지 않는 것이 중요합니다. 스크립터블 오브젝트는 프로젝트에 복잡성을 더할 수 있으므로 명확한 이점을 제공하는 경우에만 배포하세요. (예를 들어 영구 데이터를 저장하는 데 사용하지 마세요.)
- 데이터를 정기적으로 백업하세요: 스크립터블 오브젝트에 대한 변경 사항은 런타임에 '실시간으로' 발생하며 에셋 파일로 저장됩니다. 데이터 손실을 방지하기 위해 프로젝트를 정기적으로 백업하세요. 버전 관리 소프트웨어를 사용하여 스크립터블 객체의 변경 사항을 추적하세요.
- 인스펙터 창을 사용합니다: 스크립터블 오브젝트의 주요 장점 중 하나는 직렬화할 수 있고 인스펙터에 표시된다는 점입니다. 에디터 인터페이스를 활용하여 스크립터블 오브젝트에 저장된 데이터를 보고 조작할 수 있습니다.
- 사용자 지정 편집기 스크립트를 유용하게 사용하세요: 스크립터블 오브젝트는 기본적으로 씬 계층구조에서 런타임 오브젝트를 참조할 수 없습니다. 이러한 개체를 시각화해야 하는 경우 에디터 스크립팅을 사용하여 인스펙터를 보다 사용자 친화적인 인터페이스로 만들 수 있습니다.
이 가이드라인을 따르면 일반적인 개발 함정을 피할 수 있습니다.
스크립터블 오브젝트를 사용한 디자인 패턴에 대한 자세한 내용은 스크립터블 오브젝트를 사용하여 Unity에서 모듈식 게임 아키텍처 만들기 전자책에서 확인할 수 있습니다. 게임 프로그래밍 패턴으로 코드 레벨 업 전자책에서 일반적인 Unity 개발 디자인 패턴에 대한 자세한 내용을 확인할 수도 있습니다.