Unity 검색

Runtime authoring in projects using ECS for Unity | Hero image
Runtime authoring in projects using ECS for Unity | Hero image
공유

Is this article helpful for you?

Thank you for your feedback!

Unity용 ECS는 저작 데이터와 런타임 데이터를 완전히 분리합니다. 게임 오브젝트의 대부분은 베이킹 프로세스를 거쳐 해당 게임 오브젝트 소스와 아무런 공통점이 없는 다른 데이터 표현인 엔티티로 변환됩니다. 유니티는 이 새로운 데이터 이원성을 관리하고 이를 바탕으로 더 나은 저작 경험을 구축할 수 있도록 데이터 모드라는 패턴을 도입합니다.

이 블로그 게시물은 사용자가 새로운 패턴에 관한 모든 사항을 숙지하여 Unity용 ECS를 사용하는 프로젝트와 관련된 새로운 에디터 워크플로를 최대한 활용할 수 있도록 지원하고자 마련되었습니다.

기초 정보

기본적인 이해를 위한 필수 용어는 다음과 같습니다.

  1. 저작 데이터란 게임에서 반복 작업을 진행할 때 수정하는 모든 항목으로, 디스크에 저장되며 버전이 관리되는 데이터입니다. 저작 데이터는 게임을 실행하거나 빌드할 때 런타임 데이터로 변환됩니다. 씬, 프리팹, 애니메이션 커브, VFX 그래프 모두 저작 데이터의 예시라고 할 수 있습니다.
  2. 런타임 데이터란 에디터의 플레이 모드나 게임 빌드에서 게임을 실행할 때 시뮬레이션에 속하는 모든 항목입니다. 런타임 데이터는 저작 데이터로 변환되지 않으며, 게임 실행을 중단하거나 플레이 모드를 종료하면 손실됩니다. 런타임 데이터의 예로는 엔티티를 들 수 있습니다.

지금까지 Unity에서 게임 오브젝트는 저작 데이터와 런타임 데이터 모두의 역할을 하는 특별한 존재였습니다. 게임 오브젝트는 씬을 구성하고 설정하는 용도(저작)로 사용되며, 게임을 실행할 때 시뮬레이션에서 수정하는 용도(런타임)로 사용되기도 합니다. 수정된 부분이 게임으로 인해 수정된 것인지, 혹은 사용자가 에디터를 통해 수정한 것인지 확실히 파악하기가 어렵기 때문에 플레이 모드를 진행하는 동안에 게임 오브젝트를 변경한 내용은 유지되지 않습니다.

하지만 Unity용 ECS를 사용하는 프로젝트에서는 더 이상 이렇게 되지 않습니다. 게임 오브젝트는 저작 데이터 역할만 맡고, 런타임 성능 향상을 위해 엔티티로 베이킹될 수 있습니다. 이렇게 되면 저작 데이터와 런타임 데이터의 형태가 상이하기 때문에 두 데이터 모두에 손쉽게 동시에 액세스할 수 있습니다. 결과적으로 에디터 모드이든 게임 상태든 관계 없이 두 데이터 모두를 수정하거나 두 데이터 중 하나만 수정할 수 있습니다.

데이터 모드

Unity용 ECS를 사용하는 프로젝트에서 저작 데이터는 런타임 데이터보다 유형, 구조, 프로퍼티가 더욱 다양합니다. 다시 말해 시뮬레이션에서 저작 데이터를 수정하는 것은 불가능하며, 시뮬레이션에서는 저작 데이터가 중요하게 여겨지지 않습니다. 실제로 게임이 실행될 때 데이터 표현은 존재하지도 않습니다. 따라서 게임이 실행되는 동안 저작 데이터를 수정할 수 있어야 더 이상 작업물이 손상될 위험이 없습니다.

또한 언제든지 컨텍스트나 작업에 따라 어떤 데이터 모드가 가장 중요한지 결정할 수 있어야 합니다. 이상적으로는 여러 데이터 모드를 원활히 전환할 수 있는 것이 가장 좋습니다.

유니티는 이러한 모든 사항을 염두에 두고 데이터 모드 패턴을 생각해 냈습니다. 데이터 모드 패턴을 사용하면 플레이 모드에서 적용하는 수정 사항이 어떻게 되는지를 더 명확히 하는 동시에, 사용자가 상호 작용하는 데이터의 표현을 결정할 수 있습니다.

데이터 모드에는 세 가지 모드, 즉 저작, 런타임, 혼합이 있습니다. 저작 및 런타임은 말 그대로 저작 데이터만 표시되거나 런타임 데이터만 표시됩니다. 혼합 모드는 더 흥미로운데, 플레이 모드에서 레벨 디자인을 진행할 때 진정한 효과를 발휘합니다. 혼합 모드에서는 저작 데이터가 최대한 많이 표시되지만, 런타임이 실행 중인 경우에는 런타임 데이터가 대신 표시됩니다. 이 모드에서는 인스펙터(Inspector)에 저작 필드와 런타임 필드가 혼합되어 표시되거나, Entities 계층 구조에 게임 오브젝트와 엔티티가 혼합되어 표시됩니다. 두 창에 대한 자세한 내용은 후반부에서 살펴보겠습니다.

데이터 모드 패턴의 주요 컴포넌트는 비손상 플레이 모드 저작과 라이브 프로퍼티입니다.

비손상 플레이 모드 저작

저작 데이터와 런타임 데이터를 명확하게 분리하면 플레이 모드에서 씬을 안전하게 저작할 수 있습니다. 오브젝트를 검사하고 저작 모드에서 해당 인스펙터를 명시적으로 배치하면 플레이 모드에서 수정 사항이 씬에 적용됩니다. 씬은 더티 상태로 표시되며, 플레이 모드가 아닐 때와 똑같이 저장할 수 있습니다. 플레이 모드를 종료해도 진행한 작업 내역이 사라지지 않습니다.

저작 데이터와 런타임 데이터가 별개의 런타임 표현인 엔티티로 베이킹되기 때문에 서브 씬 내부의 게임 오브젝트에만 이러한 데이터 분리가 적용됩니다. 서브 씬 외부의 게임 오브젝트에는 이러한 분리가 적용되지 않으며, 이 경우 게임 오브젝트는 이전과 똑같이 Unity에서 자체 런타임 표현의 역할을 합니다. 데이터 모드 측면에서 순수 게임 오브젝트는 플레이 모드 중 런타임 전용 개념으로 간주됩니다.

라이브 프로퍼티

라이브 프로퍼티는 게임을 실행할 때 혼합 모드의 인스펙터에 표시됩니다. 라이브 프로퍼티는 게임 오브젝트 인스펙터의 일반 필드와 함께 표시되며 흥미로운 프로퍼티를 포함합니다.

첫 번째로, 인스펙터가 저작 모드일 경우 필드에 표시될 값을 변경합니다. 대신 이에 상응하는 런타임 데이터 필드의 현재 값을 표시합니다. 라이브 프로퍼티에서 표시되는 항목은 엔티티의 컴포넌트 데이터에서 직접 가져온 내용이라는 점이 중요합니다. 양방향 바인딩이라는 점도 인지하고 있는 편이 좋습니다. 이 필드를 편집하면 변경 사항이 ECS 데이터에 바로 푸시될 뿐만 아니라 디스크의 씬 파일을 거치지 않고 게임(Game) 뷰에 즉시 나타납니다.

두 번째로, 명확한 시각적 표시기 역할을 하는 주황색 바가 있습니다. 주황색 바는 하나의 핵심 개념으로 런타임 데이터가 처리되고 있음을 의미하며, 이러한 데이터에 적용한 사항은 플레이 모드가 종료되면 손실됩니다.

라이브 프로퍼티는 바인딩을 설정할 수 있는 필드에만 적용되며, 저작 데이터와 런타임 데이터에서 이에 상응하는 필드 간에 일대일 관계가 존재해야 합니다.

The Transform fields have orange bars:  they are displaying Runtime Data. | The Cartesian Grid on Cube fields do not have the orange bar: they are displaying Authoring Data.
Transform 필드에는 주황색 바가 있으며 런타임 데이터를 표시하고 있음 | Cartesian Grid on Cube 필드에는 주황색 바가 없고 저작 데이터를 표시하고 있음

워크플로

데이터 모드 스위치

엔티티를 사용할 때 데이터 모드와의 주요 상호 작용은 데이터 모드 스위치를 통해 이루어집니다. 인스펙터 창과 Entities 계층 창 위에 있는 원의 상태를 통해 현재 창의 모드를 한눈에 확인할 수 있습니다.

Depiction of the circles that appear above your Inspector and Entities Hierarchy windows that tell you – at a glance – what mode a window is currently in.

데이터 모드 스위치를 클릭하면 드롭다운 목록에 'Automatic'이라는 네 번째 옵션이 표시됩니다. 이는 모드가 아닌 스위치 자체를 위한 옵션으로, Unity에서 컨텍스트에 따라 창이 어떤 모드에 있어야 하는지를 제어할 수 있습니다(이 블로그 게시물 후반부에서 설명). 목록에서 모드를 명시적으로 선택하면 Automatic을 다시 선택할 때까지 사실상 해당 창의 모드가 잠깁니다. 잠긴 상태의 경우 아이콘에 밑줄이 표시됩니다.

Alternate depiction of the circles that appear above your Inspector and Entities Hierarchy windows that tell you – at a glance – what mode a window is currently in.

주황색 바

주황색 바는 런타임 또는 저작 데이터 모드에서 창에 표시되며, 항상 런타임 데이터와 관련이 있음을 나타냅니다. 인스펙터에서는 주황색 바를 통해 플레이 모드 종료 시 값이 되돌려지는 필드가 무엇인지 알 수 있습니다(위의 '라이브 프로퍼티' 참조). Entities 계층 구조에서는 서브 씬과 엔티티 외부의 게임 오브젝트를 알 수 있습니다(위의 '비손상 플레이 모드 저작' 참조).

런타임 모드에서는 어떠한 저작 데이터에도 액세스할 수 없기 때문에 창이 런타임 모드일 때는 모든 항목에 주황색 바가 표시됩니다. 주황색 바를 표시하는 의도는 적용 중인 변경 사항이 일시적임을 손쉽게 알아차릴 수 있도록 하기 위함입니다. 이러한 주황색 바는 플레이 모드 색상과 같이 많은 개발자가 변경 사항을 적용하지 않도록 상기하는 데 사용하는 기능의 보다 국소적인 버전이라 할 수 있습니다.

Orange bars in the Entities Hierarchy, in mixed mode
Entities 계층 구조의 주황색 바(혼합 모드)
Orange bars in the Inspector, in runtime mode
인스펙터의 주황색 바(런타임 모드)

인스펙터 창

인스펙터 창은 가장 단순한 사례라 할 수 있습니다. 모드 간에 서로 대응하는 항목이 있는 게임 오브젝트나 엔티티를 검사할 경우 저작 모드 또는 런타임 모드를 토글하여 전환할 수 있습니다.

주목할 만한 몇 가지 유의 사항은 다음과 같습니다.

  • 플레이 모드 외부에서 데이터 런타임 표현은 읽기 전용입니다.
  • 플레이 모드에서 순수 엔티티 및 게임 오브젝트는 저작 표현이 없습니다.

데이터 모드 스위치가 Automatic으로 설정되어 있으면 인스펙터 창에서는 Entities 계층 구조의 현재 데이터 모드를 유지하려 하며 편집 모드에서는 저작 데이터를, 플레이 모드에서는 혼합 데이터를 표시합니다.

Entities 계층 창

Entities 계층 창은 저작 모드에서 일반 씬 계층 구조와 거의 비슷하게 동작합니다. 게임 오브젝트, 씬, 서브 씬이 표시되고, 프리팹 아이솔레이션 등으로 들어갈 수 있으며, 이것이 편집 모드의 기본 설정입니다.

런타임 모드에서는 엔티티, 씬, 서브 씬은 물론 서브 씬 외부의 게임 오브젝트가 표시됩니다.

데이터 모드 스위치가 Automatic으로 설정되어 있으면 Entities Hierarchy 창에서는 우선적으로 편집 모드에서 저작 데이터를, 플레이 모드에서 혼합 데이터를 표시합니다.

결론

데이터 모드 패턴을 사용하면 저작 데이터와 런타임 데이터의 분리와 관련된 데이터의 이원성을 보다 손쉽게 관리할 수 있습니다. 이 패턴의 두 핵심 컴포넌트인 비손실 플레이 모드 저작과 라이브 프로퍼티를 활용하면 저작 데이터 및 런타임 데이터 모두와 동시에 상호 작용할 수 있어, 플레이 모드에서 안전하게 저작하고 엔티티 컴포넌트 데이터를 실시간으로 업데이트할 수 있습니다. 이러한 방법으로 Unity용 ECS를 사용하는 프로젝트의 저작 경험을 개선해 보세요.

자세한 내용은 GDC 2022 발표를 살펴보세요. 이후 UX가 일부 업데이트되었으나 기본 원칙은 계속 유효합니다. 추가로 이 동영상에서는 Unity용 ECS를 사용하는 게임 제작 여정에 유용한 다른 툴도 소개합니다.

Unity용 ECS에 대해 더 논의하고 싶다면 포럼을 방문하세요. 연재 중인 Tech from the Trenches 시리즈에서 다른 Unity 개발자들의 새로운 기술 블로그도 확인해 보시기 바랍니다.

2023년 3월 22일 엔진 & 플랫폼 | 12 분 소요

Is this article helpful for you?

Thank you for your feedback!

관련 게시물