언리얼 엔진의 일반적인 액터 시스템과 달리, 씬 그래프는 엔티티 및 컴포넌트 시스템을 사용하여 월드의 오브젝트를 정의합니다. 엔티티는 컴포넌트와 다른 엔티티의 컨테이너 역할을 하고, 컴포넌트는 자신이 어태치된 엔티티의 작동 방식을 설정해 줍니다. 씬 그래프로 게임 오브젝트를 만들려면 베이스 엔티티에서 시작하여 컴포넌트로 데이터와 행동을 추가해야 합니다. 각 컴포넌트는 새 행동을 제공하며, 컴포넌트를 모두 조합하여 재사용 및 반복작업할 수 있는 복잡한 오브젝트를 만들 수 있습니다.
제작 기초
이를 설명하기 위해 템플릿 홀의 첫 번째 섹션에 일련의 가로등을 준비해 두었습니다. 각 가로등은 프리팹이거나, 단일 오브젝트로 저장된 엔티티와 컴포넌트의 컬렉션입니다. 프리팹 오브젝트는 자신의 기반 엔티티 및 컴포넌트의 특성, 행동, 프로퍼티 및 어트리뷰트를 공유합니다. 엔티티 및 컴포넌트에 대해 자세히 알아보려면 엔티티 및 컴포넌트 작업하기 문서를 참조하세요.
인스턴스화를 통한 반복작업
프리팹은 에셋이며, 편집 또는 게임플레이 시 이를 레벨에서 인스턴스화할 수 있습니다. 콘텐츠 브라우저(Content Browser)에서 프리팹을 드래그하거나 Verse 코드로 사본을 생성할 때마다 월드에는 해당 씬 그래프 프리팹의 새 인스턴스를 인스턴스화하게 됩니다.
프리팹의 각 인스턴스마다 메모리와 처리 오버헤드가 있지만, 프리팹에서 사용되는 에셋 리소스가 인스턴스 간에 공유되므로 새 프리팹을 인스턴스화해도 메모리가 늘어나지는 않습니다.
동일한 오브젝트를 가지고 여러 번 인스턴스화하는 것은 매우 효과적인 방법이지만, 프리팹 역시 디자인 반복작업을 빠르게 수행하는 데 유용합니다. 콘텐츠 브라우저에서 LightPost 폴더를 엽니다. 이 폴더에는 최종 P_LightPost 프리팹 디자인을 생성하는 데 사용되는 에셋이 저장됩니다.
홀의 각 가로등은 이 프리팹의 일부를 나타냅니다. 홀을 따라 이동하면 마지막 프리팹 디자인에 도착할 때까지 단계마다 새 컴포넌트가 추가됩니다.
첫 번째 가로등은 세 개의 엔티티, 즉 가로등, 피벗, 랜턴으로 이루어진 간단한 구성입니다. 이 세 개의 엔티티 각각에는 레벨에서의 위치를 결정하는 transform_component가 있습니다. 부모 및 랜턴 엔티티 모두 mesh_component가 있어 시각적으로 확인할 수 있으며, 가로등 및 랜턴의 모델을 각각 표시할 수 있습니다. 두 엔티티 모두 가로등과 랜턴 사이의 연결을 나타내는 피벗(Pivot) 엔티티로 연결되어 있습니다.
두 번째 가로등은 원래 디자인을 반복작업한 것으로, 새 엔티티에 랜턴의 후손인 sphere_light_component를 추가하여 빛이 나도록 했습니다.
하지만 단지 빛나는 것만으로는 흥미를 끌기 어렵기 때문에, 세 번째 가로등에는 particle_system_component를 추가하여 SphereLight 엔티티 주변에 나방이 날아다니도록 시뮬레이션함으로써 시각적 요소를 더했습니다.
이어서 네 번째 가로등 인스턴스는 커스텀 simple_movement_component 및 keyframe_movement_component 모두를 피벗 엔티티에 추가합니다. 이러한 컴포넌트가 함께 작동하여 엔티티 및 해당 후손에서 이동을 시뮬레이션하고 랜턴이 앞뒤로 흔들리게 합니다.
또한 컴포넌트는 Verse를 통해 랜턴이 이동하는 경로, 경로에서 랜턴이 이동할 거리, 랜턴의 회전을 결정하여 바람에 불빛이 흔들리는 모습을 모방합니다. 키프레임 이동 컴포넌트는 simple_movement_component의 좌표에 따라 부드럽고 지속적인 이동을 만들어냅니다.
마지막 가로등 인스턴스는 커스텀 Verse lantern_interaction_component를 가로등에 추가하고, interactable_component를 랜턴에 추가합니다. 플레이어가 랜턴에 접근하여 상호작용하면 전체 가로등에서 각 light_component 및 particle_system_component를 활성화 및 비활성화하여 lantern_interaction_component가 랜턴을 켜고 끕니다.
오버라이드
프리팹을 인스턴스화하면 인스턴스화한 원본의 프리팹 정의와 동일한 기본값으로 시작됩니다. 그러면 프리팹 인스턴스 중 하나의 특정 요소를 변경하고 싶을 때는 어떻게 해야 할까요? 예를 들어 다른 색상의 라이트나 나무 가로등 대신 금속 기둥을 사용하고 싶을 수 있습니다. 바로 이러한 경우에 오버라이드를 사용합니다.
오버라이드를 사용하면 프리팹 클래스의 인스턴스에서 값을 변경하여 부모 프리팹을 변경하지 않고도 각 인스턴스를 커스터마이징할 수 있습니다. 프리팹 인스턴스에서 중첩된 컴포넌트의 옵션을 변경하는 경우, 이러한 변경사항은 부모 프리팹의 옵션을 오버라이드하고 해당 인스턴스에 대해서만 해당 컴포넌트 수준에서 엔티티가 동작하는 방식을 변화시킵니다.
개별 프리팹 인스턴스에서 오버라이드와 변경을 적용하면 씬을 다양하게 연출할 수 있습니다. 반대로 변경사항을 프리팹의 모든 인스턴스에 전파하려는 경우에는 프리팹 에디터를 사용하여 씬의 모든 프리팹에 해당 변경사항을 반영할 수 있습니다.
씬 그래프의 Verse 기능
씬 그래프는 Verse 네이티브 시스템으로, 이를 통해 둘을 함께 활용하면 강력한 기능을 만들 수 있습니다. 프로젝트에서 생성하는 프리팹은 Assets.digest.verse 파일을 통해 Verse에서 에셋 클래스로 노출되며 Verse 컴포넌트 및 Verse 장치의 코드에서 이를 참조할 수 있습니다.
또한 Verse를 사용하여 씬의 개별 엔티티 및 컴포넌트를 쿼리할 수도 있습니다. GetComponents() 함수를 사용하면 타입을 기반으로 특정 컴포넌트를 가져올 수 있고, GetEntities()를 사용하면 특정 부모의 모든 자손 엔티티가 반환됩니다. 또한 씬 그래프 계층구조에서 위와 아래 방향으로 검색하여 후손 및 조상 엔티티를 찾을 수도 있습니다. 이 템플릿에서 사용되는 P_LightPost 프리팹에는 Verse가 사용되어 랜턴의 흔들리는 움직임과 상호작용 기능을 만듭니다.
작동하는 게임 오브젝트를 만드는 방법에 대해 자세히 알아보려면 다음 섹션인 이동 및 상호작용을 계속 진행하세요.
이동 및 상호작용
엔티티에 이동 기능을 추가하여, Verse 컴포넌트와 키프레임 이동 컴포넌트로 작동하는 게임 오브젝트를 만드는 방법을 알아봅니다.