기존의 포스트에서 다룬 예제들을 보면, 하나의 프로젝트에 한두개의 언리얼 오브젝트가 포함되었습니다.
하지만 프로젝트가 점점 커질수록 그 안의 데이터의 양은 점점 늘어나고,
이는 곧 손으로 셀 수 없을 정도의 언리얼 오브젝트가 프로젝트에 포함되는 것을 의미합니다.
이런 상황에 대비하기 위해 언리얼 엔진은 언리얼 오브젝트를 효과적으로 저장하고 불러들이고자
패키지 단위로 언리얼 오브젝트를 관리합니다.
이번 포스트에서는 언리얼 오브젝트의 관리 단위인 패키지와 그 휘하 단위들을 알아보겠습니다.
1) Package와 Asset
패키지는 다수의 언리얼 오브젝트를 포장하는데 사용되는 언리얼 오브젝트입니다.
그리고 모든 언리얼 오브젝트는 패키지에 소속되어 있습니다.
그리고 이런 패키지에 소속된 서브 오브젝트들을 Asset이라고 하며
에디터에서 시각적으로 확인할 수 있는 오브젝트들이 바로 Asset입니다.
에셋 아래에는 다시 다수의 서브 오브젝트들이 포함되며, 모두 패키지에 소속됩니다.
그림으로 간단하게 나타내면 다음과 같습니다.
패키지에는 다수의 언리얼 오브젝트가 포함될 수 있지만, 일반적으로는 하나의 애셋만 가지게끔 설계되어 있습니다.
2) 오브젝트 경로
프로젝트에서 애셋 간의 연결 작업을 위해 직접 패키지를 불러 할당하는 것은 매우 비효율적입니다.
부하가 크고 이로 인해 발생하는 비용이 매우 높기 때문입니다.
따라서 이를 위해 언리얼 오브젝트는 오브젝트 경로(Object Path)를 사용합니다.
오브젝트 경로는 패키지 이름과 애셋 이름을 하나로 묶은 문자열입니다.
형식은 다음의 2가지 중 하나를 사용합니다.
{애셋클래스정보}'{패키지이름}.{애셋이름}'
또는
{패키지이름}.{애셋이름}
오브젝트 경로는 프로젝트 내에서 유일값을 보장받습니다.
따라서 오브젝트 경로를 사용해 필요한 애셋만 로드하는 것이 가능합니다.
이때 여러가지 애셋 로딩 전략을 세워 애셋을 로드하는 것이 가능합니다.
3) 애셋의 로딩 전략
애셋을 로딩하는 전략은 총 3가지로 구성할 수 있습니다.
(1) 프로젝트 내에 애셋이 반드시 필요한 경우 : 생성자를 통한 CDO에서 미리 애셋을 로딩합니다.
(2) 런타임에서 필요한 상황에 바로 로딩하는 경우 : 런타임 로직에서 정적으로 애셋을 로딩합니다.
(3) 런타임에서 비동기적으로 로딩하는 경우 : 런타임 로직에서 관리자를 사용해 비동기적으로 애셋을 로딩합니다.
이어서 관리자란 무엇인지 말씀드리겠습니다.
4) FStreamableManager
FStreamableManager는 애셋의 비동기 로딩을 지원하는 관리자 객체를 의미합니다.
사용하는 경우에는 콘텐츠 제작과는 무관한 싱클턴 클래스에 선언하는 것이 좋은데,
대표적으로 GameInstance가 있습니다.
또한 다수의 오브젝트 경로를 입력해 다수의 애셋 로딩도 가능합니다.
그렇다면 이제 예제를 통해 패키지와 애셋을 어떻게 프로젝트에서 사용하는지 한번 알아보겠습니다.
5) 예제
Member라는 언리얼 오브젝트를 패키지로서 관리해보고
이를 동기, 비동기, 애셋, 오브젝트로 로드하는 방법도 한번 알아보겠습니다.
MyGameInstance.h는 위와 같이 구성되어 있습니다.
또한 모든 케이스별로 공통된 부분을 cpp에서 갖고 있어야 하는데,
다음과 같습니다.
패키지를 저장하는 코드와 static 멤버 변수를 설정하는 코드는 모든 케이스가 갖고 있게 됩니다.
5 - 1) 생성자를 통한 오브젝트 로딩
제일 먼저 생성자를 통해 애셋을 로딩하는 경우를 알아보겠습니다.
생성자에서는 Init과 같은 다른 함수를 사용하지 않고 생성자만을 사용해 필수적으로 에셋을 로드해보겠습니다.
코드는 다음과 같습니다.
에디터를 실행시켜 결과를 확인해보면
패키지 역시 잘 생성되었음을 확인할 수 있습니다.
5 - 2) 비동기적으로 오브젝트를 로딩
핸들을 통한 비동기적인 로딩은 Init() 에서 진행됩니다.
코드는 다음과 같습니다.
실행결과를 확인해보면
마찬가지로 잘 저장되고 로드되었음을 확인할 수 있습니다.
5 - 3) 동기적으로 패키지를 통한 오브젝트 로딩
코드는 위와 같습니다.
실행결과를 확인해보면
잘 동작하였음을 확인할 수 있습니다.
마지막으로, 동기적으로 언리얼 오브젝트를 로드하되 패키지를 거치지 않는 경우를 알아보겠습니다.
5 - 4) 동기적으로 패키지를 통하지 않고 오브젝트 로딩
소스코드는 다음과 같습니다.
실행결과를 확인해보면
잘 동작하였음을 확인할 수 있습니다.
작업의 규모가 커질수록 사용하는 언리얼 오브젝트의 양이 많아집니다.
그 경우에 패키지를 사용하여 보다 편리하게 언리얼 오브젝트를 관리한다면
프로젝트의 진행에 있어 큰 도움이 될 것입니다.
'언리얼 > 언리얼 C++' 카테고리의 다른 글
언리얼 향상된 입력 시스템 (0) | 2024.09.21 |
---|---|
언리얼 구형 입력 시스템 (0) | 2024.09.21 |
언리얼 엔진의 메모리 관리 (2) ~ 직렬화 (0) | 2024.08.11 |
언리얼 엔진의 메모리 관리 (1) ~ 가비지 컬렉션 시스템 (0) | 2024.08.03 |
언리얼 C++ - 구조체 (0) | 2024.07.27 |