Hero image

Unity ScriptableObjects 데모를 시작하세요

이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

이 페이지는 전자책 Unity에서 ScriptableObjects로 모듈형 게임 아키텍처 만들기의 동반 데모 프로젝트인 PaddleBallSO에 대한 개요를 제공하며, 코드 아키텍처에서 디자인 패턴과 모듈성을 어떻게 사용하는지 설명합니다.

이것은 전자책에 동반되는 데모를 지원하기 위해 Unity 개발자를 돕기 위해 만들어진 6개의 미니 가이드 시리즈 중 첫 번째입니다. 이 데모는 고전적인 공과 패들 아케이드 게임 메커니즘에서 영감을 받았으며, ScriptableObjects가 테스트 가능하고 확장 가능하며 디자이너 친화적인 구성 요소를 만드는 데 어떻게 도움이 되는지를 보여줍니다.

전자책, 데모 프로젝트 및 이러한 미니 가이드는 Unity 프로젝트에서 ScriptableObject 클래스와 함께 프로그래밍 디자인 패턴을 사용하는 모범 사례를 제공합니다. 이 팁은 코드를 단순화하고, 메모리 사용량을 줄이며, 코드 재사용성을 촉진하는 데 도움이 될 수 있습니다.

이 시리즈에는 다음 기사가 포함됩니다:

시작하기 전에 중요한 참고 사항

스크립터블 오브젝트 데모 프로젝트와 이 미니 가이드 시리즈에 들어가기 전에, 디자인 패턴의 핵심은 단지 아이디어라는 것을 기억하세요. 모든 상황에 적용되지 않을 것입니다. 이 기술들은 Unity와 ScriptableObjects를 다루는 새로운 방법을 배우는 데 도움이 될 수 있습니다.

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

궁극적으로, 최고의 코드 아키텍처는 귀하의 프로젝트와 팀에 맞는 것입니다.

패들볼

패들 볼 ScriptableObject 프로젝트

PaddleBallSO는 현대 비디오 게임의 탄생을 가져온 고전 게임을 중심으로 하며, 두 명의 플레이어, 두 개의 패들, 그리고 하나의 공이 특징입니다.

여기서 강조하는 것은 게임 메커니즘보다는 인프라입니다. 이것을 "게임 배관"이라고 생각하세요 - 덜 화려하지만 애플리케이션을 실행하는 데 필수적인 기초입니다.

이 프로젝트는 스크립터블 오브젝트가 어떻게 비하인드 씬에서 통합된 애플리케이션을 구축하는 데 작용할 수 있는지에 중점을 둡니다. 이들을 사용하여 프로젝트 유지 관리를 단순화하고 코드 재사용성을 촉진할 수 있는 다목적 게임 시스템을 구축하세요. 플레이어 데이터, 게임 상태 관리, 인게임 행동 등에도 사용할 수 있습니다.

PaddleBallSO 프로젝트는 현재 2022 LTS의 최신 Unity Long Term Support (LTS) 버전과 호환됩니다. 런타임 UI를 생성하기 위해 UI 툴킷을 통합하고, 사용자 입력을 처리하기 위해 입력 시스템을 사용합니다.

부트로더

시작하기

GitHub repository에서 프로젝트를 찾아 다운로드하세요.

게임 시스템 메뉴에서 부트로더 장면을 로드하거나 재생 시 부트스트랩 장면 로드를 활성화하십시오. 재생 모드에 들어가 시작하십시오.

이것들은 ScriptableObjects에 특정한 것은 아니지만, 데모 프로젝트는 게임 애플리케이션을 일관되고 예측 가능한 상태로 시작하는 데 도움이 되는 몇 가지 일반적인 기술을 사용합니다.

장면 부트스트래퍼 (또는 부트로더)는 게임의 초기 상태를 설정하는 책임이 있는 에디터 확장 스크립트입니다. 이 초기화 코드는 게임 로직과 분리되어 있으며, 장면의 객체에 대한 모든 종속성이 올바르게 설정되도록 보장합니다.

종속성 문제를 피하기 위해, 부트스트래퍼는 장면이 로드될 때 필수 게임 객체, 관리자 또는 서비스를 구성합니다.

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

부트스트랩 장면의 또 다른 구성 요소인 시퀀스 관리자는 장면 로드 시 필수 프리팹을 인스턴스화할 수 있습니다. 이 특정 데모 프로젝트에서 게임을 만들기 위해 필요한 모든 것은 카메라, 스플래시 화면, UI 메뉴 및 장면 로더를 포함한 프리팹입니다.

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

프로젝트 장면

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

많은 프로젝트는 부트스트랩 장면 이후에 메인 메뉴를 위한 스테이징 영역도 포함합니다. 이 간소화된 데모 프로젝트는 메인 메뉴 장면을 생략합니다.

tab5

PaddleBallSO 프로젝트 개요

재생패턴 메뉴를 사용하여 패들볼SO를 테스트하십시오. 여기에는 다음이 포함됩니다:

  • 디자인 패턴 데모 또는 특정 기술을 보여주고 각 패턴을 고립하여 설명하는 간단한 예제
  • 미니게임은 이를 결합하여 기능적이고 작동하는 샘플을 만듭니다.

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

tab10

패턴 및 미니 게임 탐색

샘플 게임은 상징적인 2D 물리 시뮬레이션을 재현하고 ScriptableObject 기반 디자인 패턴의 잠재력을 보여줍니다.

패턴에 뛰어들기 전에 애플리케이션을 구성하는 MonoBehaviour에 익숙해지는 것이 좋습니다. 예상할 수 있듯이, Paddle, Ball, Bouncer 및 ScoreGoal 스크립트와 같은 구성 요소는 기본 게임 플레이를 지배합니다.

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

  • 게임매니저는 게임 상태(시작, 종료, 재설정)를 제어하고, 게임 구성 요소를 초기화하며, UI를 관리하고, 이벤트에 응답합니다.
  • 게임설정은 GameManager와 함께 공, 패들, 벽 및 목표를 설정합니다.
  • 점수관리자는 점수 값을 업데이트하고, 게임 이벤트를 처리하며, 점수 표시를 위한 UI 업데이트를 제어합니다.

이 MonoBehaviour는 ScriptableObject와 함께 작동합니다. 이들은 이러한 구성 요소가 서로 통신하고 데이터를 공유할 수 있도록 연결하는 중요한 역할을 합니다.

이벤트는 프로젝트의 다양한 부분 간의 통신에 필수적입니다. 이들은 이러한 관리자 스크립트를 다른 장면 객체 및 사용자 인터페이스와 연결합니다. 이 이벤트 기반 아키텍처는 코드를 더 조직적이고 디버깅하기 쉽게 만드는 데 도움이 될 수 있습니다.

가장 일반적인 ScriptableObject 패턴에 대한 간소화된 데모 예제를 제공했습니다. 이들에 익숙해지면 ScriptableObject가 미니게임 아키텍처의 기초가 되는 방식을 인식하기 시작할 것입니다.

특집 미니게임을 훨씬 적은 코드 줄로 만들 수 있었지만, 이 데모는 특히 ScriptableObject와 함께 디자인 패턴에 중점을 두고 있습니다. ScriptableObject 없이도 이러한 패턴 중 많은 것을 구현할 수 있다는 점에 유의하세요.

각 패턴이 프로젝트에 어떻게 적용될 수 있을지 팀으로 결정하고, 여러분에게 가장 적합한 접근 방식을 선택하세요.

tanb22

모듈형 게임 아키텍처

소프트웨어 개발에서 모듈화는 애플리케이션을 더 작고 독립적인 조각으로 나누는 것을 포함합니다. 이 모듈들은 특정 목적을 수행하며 별도로 개발하고 테스트할 수 있습니다.

각 작은 객체 집합은 하나의 단위로 기능하며 게임의 한 측면을 처리합니다. 이것은 플레이어 입력 제어, 물리 처리 또는 점수 집계와 같은 어떤 것이든 될 수 있습니다.

프로젝트 스크립트를 탐색할 때 다음의 주요 사항에 주의하세요:

  • 프리팹에서 장면 구성하기: 프로젝트의 대부분의 장면은 최소한의 오버라이드가 있는 프리팹의 모음이라는 것을 알 수 있습니다. 프리팹은 본질적으로 모듈성의 수준을 제공합니다. 기능 문제 해결은 특정 프리팹을 독립적으로 테스트하는 문제입니다. 스크립터블 오브젝트와 마찬가지로, 프리팹은 여러 장면에서 재사용되고 공유될 수 있는 프로젝트 수준 자산입니다.
  • 데이터 저장을 위해 스크립터블 오브젝트 사용하기 (및 그 이상): 정적 게임플레이 데이터를 저장하기 위해 모노비헤이비어를 사용하지 마세요. 대신, 더 나은 재사용성을 위해 스크립터블 오브젝트를 활용하세요. 특정 게임 로직을 스크립터블 오브젝트에 위임하거나 장면 객체 간의 통신을 촉진하도록 할 수 있습니다.
  • 관심사 분리: 프로젝트에서 데이터, 로직 및 사용자 인터페이스 간의 명확한 구분을 유지하세요. 이것은 코드 유지 보수성을 향상시키고 디버깅을 단순화합니다. 우리의 메뉴 화면 시스템은 최신 UI 툴킷을 활용합니다. 이 UI 시스템은 인터페이스를 그 기본 로직과 분리하는 워크플로우를 강제합니다. 자세한 내용은 유니티의 사용자 인터페이스 디자인 및 구현 전자책을 확인하세요.
  • 의존성 최소화: 구성 요소 간의 의존성을 줄이면 예기치 않은 문제를 일으키지 않고 프로젝트의 일부를 수정하거나 교체하기가 더 쉬워집니다.
  • 통신을 위한 이벤트 사용: 이벤트는 구성 요소 간의 느슨한 결합을 가능하게 하여 서로 직접적인 의존성 없이 메시지를 보낼 수 있게 합니다. 스크립터블 오브젝트 기반의 “이벤트 채널”로 더 추가적인 분리를 할 수 있습니다.
  • 불필요한 싱글톤 피하기: 싱글톤 디자인 패턴은 유용할 수 있지만, 클래스의 단일 인스턴스가 필수적일 때만 사용해야 합니다. 싱글톤을 과도하게 사용하면 코드가 밀접하게 결합되어 테스트에 방해가 될 수 있습니다. 필요하지 않다면 싱글톤을 건너뛰세요.

대규모 단일 스크립트를 더 작은 조각으로 리팩토링하면 재사용성과 확장성을 촉진합니다. 이는 팀 협업을 개선하고 테스트를 단순화합니다.

디자인 패턴

작동 중인 ScriptableObjects

우리는 스크립터블 오브젝트 사용 사례를 보여주기 위해 PaddleBallSO 프로젝트를 만들었습니다. 다음은 이들이 작동하는 몇 가지 특정 장소입니다:

  • GameDataSO 스크립터블 오브젝트는 게임 설정을 위한 중앙 데이터 컨테이너 역할을 합니다. 공통 데이터를 한 번 편집한 후, 이를 필요로 하는 다른 객체와 공유하세요.
  • 미니 게임은 느슨한 방식으로 통신하기 위해 수많은 이벤트 채널에 의존합니다. 이 스크립터블 오브젝트 기반 이벤트는 객체가 서로 메시지를 보내는 방식의 중추를 형성합니다.
  • 사운드 재생은 MonoBehaviour 구성 요소와 로직을 분리하기 위해 스크립터블 오브젝트 기반의 델리게이트 객체를 사용합니다.
  • 우리는 Player1과 Player2 간의 “팀”을 구별하기 위해 PlayerIDSO 스크립터블 오브젝트 기반 열거형을 사용합니다.
  • LevelLayoutSO 스크립터블 오브젝트는 패들, 골, 벽 및 공과 같은 게임 요소의 시작 위치에 대한 데이터 컨테이너 역할을 합니다. 이것은 유니티 내에서 및 내보낸 JSON 파일을 통해 외부에서 레벨 레이아웃을 쉽게 수정할 수 있게 해줍니다. 유니티 외부에서 레벨 디자인을 수정하는 것은 플레이어의 창의성과 사용자 정의 레이아웃 공유를 장려할 수 있습니다.

몇 가지 추가 사항을 위해 디자인 패턴 데모를 꼭 확인하세요!

parcelbox

ScriptableObjects에 대한 6가지 모범 사례

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

유니티에서 스크립터블 오브젝트를 사용할 때의 몇 가지 모범 사례는 다음과 같습니다:

  • 데이터를 모듈화하고 정리하세요: 다양한 데이터 유형(예: 플레이어 통계용 하나, 적 행동용 하나 등)에 대해 별도의 스크립터블 오브젝트를 사용하세요. 복잡한 데이터를 쉽게 관리할 수 있는 더 작은 조각으로 나누세요.
  • 폴더 및 명명 규칙 사용: 스크립터블 오브젝트는 스크립트의 코드를 줄이는 데 도움이 될 수 있지만, 그 대가로 프로젝트 폴더에 더 많은 자산을 다루어야 합니다. 적절한 명명 및 디렉토리 조직은 이러한 스크립터블 오브젝트를 효율적으로 관리하는 데 도움이 될 수 있습니다. 명명에 대한 팁은 코드 스타일 가이드를 확인하세요.
  • 스크립터블 오브젝트의 과도한 사용을 피하세요: 스크립터블 오브젝트는 놀라운 데이터 컨테이너이지만, 과도하게 사용하지 않는 것이 중요합니다. 스크립터블 오브젝트는 프로젝트에 복잡성을 추가할 수 있으므로, 명확한 이점이 있을 때만 배포하세요. (예를 들어, 지속적인 데이터를 저장하는 데 사용하지 마세요.)
  • 데이터를 정기적으로 백업하세요: 스크립터블 오브젝트에 대한 변경 사항은 런타임 중에 "실시간"으로 발생하며 자산 파일로 저장됩니다. 프로젝트를 정기적으로 백업하여 데이터를 잃어버리지 않도록 하세요. 버전 관리 소프트웨어를 사용하여 ScriptableObjects의 변경 사항을 추적하세요.
  • 인스펙터 창 사용하기: ScriptableObjects의 주요 장점 중 하나는 직렬화 가능하며 인스펙터에 나타난다는 것입니다. Editor 인터페이스를 활용하여 ScriptableObjects에 저장된 데이터를 보고 조작하세요.
  • 맞춤형 Editor 스크립트를 활용하세요: ScriptableObjects는 기본적으로 씬 계층의 런타임 객체를 참조할 수 없습니다. 객체를 시각화해야 하는 경우 인스펙터를 보다 사용자 친화적인 인터페이스로 만들기 위해 Editor 스크립팅을 사용하세요.

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

스크립터블 아우트로

더 많은 ScriptableObject 리소스

ScriptableObjects와 함께하는 디자인 패턴에 대한 자세한 내용은 전자책 'ScriptableObjects로 Unity에서 모듈식 게임 아키텍처 만들기'를 참조하세요. 전자책 '게임 프로그래밍 패턴으로 코드를 향상시키기'에서 일반적인 Unity 개발 디자인 패턴에 대한 자세한 내용을 찾을 수 있습니다.