Part1 14. 언리얼 오브젝트 관리 : 패키지, 애셋하고싶은거/Unreal2024. 3. 16. 11:59
Table of Contents
언리얼 오브젝트 "패키지" = 다양한 오브젝트를 감싼 오브젝트
언리얼 오브젝트 패키지
저번 직렬화 를 통해서 '단일'언리얼 데이터를 저장했었다.
다양한 오브젝트를 저장하기 위해서, 그리고 다양한 데이터(복잡한 계층 구조)를 효과적으로 찾고 관리하기 위해
언리얼 오브젝트 패키지(UPackage)단위로 언리얼 오브젝트를 관리한다.
(패키지는 이 외에도 최종 콘텐츠 프로그램, DLC와 같이 확장 콘텐츠에 사용되는 pkg파일등 다양하게 사용되는 단어이다.)
언리얼 오브젝트 패키지 & 애셋
- 언리얼오브젝트 패키지는 다수의 언리얼 오브젝트를 포함한다.
= 모든 언리얼 오브젝트는 패키지에 소속되어 있다. - 패키지 바로 하단에 위치한게 Asset 애셋
- 일반적으로 하나의 패키지에는 하나의 애셋만 저장하는 것을 원칙으로 한다.
- 애셋은 여러개의 서브 오브젝트를 가질 수 있다.
- 패키지, 애셋, 서브오브젝트들 중에서 에디터에서 보여지는 정보는 애셋뿐!
패키지 생성, 저장, 불러오기실습
1. 패키지 생성
- 40, 41줄 : 패키지를 생성, 저장할 함수와 불러올 함수 2개를 선언
- 48~50줄 : 패키지와 애셋 변수 설정
- 7줄 : 패키지 저장을 위한 헤더 추가
- 10, 11줄 : 패키지와 애셋 이름 설정
- 원래는 177줄처럼 패키지를 생성만 했겠지만, 안전성을 위해
- 169~174줄 : 패키지를 생성, 저장하기 전에 같은 패키지가 있는지 체크한다.
2. 애셋 및 서브 오브젝트 생성
- 182줄 : 패키지에 오브젝트를 어떻게 저장할 지 정하는 플래스
RF_Public, RF_Standalone 외에도 방식이 다양한데, ctrl+클릭 으로 볼 수 있다. - 188줄 : 애셋 생성
여기서 클래스 정보라는건 클래스 타입?같이 클래스 내에 있는 정보말고 클래스 자체의 정보를 말한다.
와.. 클래스 자체의 정보 : UCLASS : CDO 이걸 까먹네 - 204줄 : 서브오브젝트 생성
3. 패키지 저장경로 설정, 패키지 저장
- 213줄 : 패키지가 저장될 경로를 설정하고 패키지 확장자를 부여한다.
FPackageName::LongPackageNameToFilename(패키지 변수, 확장자를 붙여줄 함수) - 219, 223줄 : 저장하려는 옵션을 설정
- 226 패키지 저장
- 패키지가 잘 저장되어서 Log를 확인할 수 있고, 에디터에서도 Content폴더에 Asset이름인 TopStudent가 올라온 것을 볼 수 있다.
4. 패키지 정보 불러오기
- 236줄 : 패키지 정보를 불러온다.
- 240~244줄 : 만약에 있을 실패를 대비해서 warnig로그 준비
- 247줄 : 패키지정보를 FullyLoad()로 모두 가져온다.
- 250줄 : 패키지 내에서 UStudent타입의 애셋이름을 가진 오브젝트를 찾고 반환
애셋 로딩
게임 제작 단계에서는 애셋 간 연결하는 작업이 많은데, 이럴때마다 일일이 패키지를 불러서 할당할거냐? 이건 너무 힘듬
그래서 직접 애셋을 로딩하는 대신, 패키지와 오브젝트를 지정한 문자열, 오브젝트 경로 를 설정해야한다.
(참고로 다음과 같은 상황에서 애셋을 로딩하게 된다.)
- 프로젝트에서 애셋이 반드시 필요한 경우 : 생성자에서 로딩을 한다.
- 런타임에서 필요한 때에 바로 로딩하는 경우 : 런타임에서 정적 로딩한다.
(근데 이러면 다른 프로세스의 실행을 막는다.=게임이 멈춘다. 그래서 기존 게임로직을 실행하면서 로딩하고 싶으면,) - 런타임에서 비동기적으로 로딩을 하는 경우 : 런타임 로직에서 관리자를 사용해 비동기 로딩한다.
오브젝트 경로
- 패키지 이름과 애셋이름을 묶은 문자열
- 패키지 내의 데이터를 모두 로드하지 않고서 오브젝트 경로를 사용해 필요 애셋만 로드가 가능하다.
{애셋 클래스 정보}'{패키지 이름}.{에셋이름}' 또는 {패키지이름}.{애셋이름}
애셋 참조
강 참조
: A가 로드되면 B가 로드
- 직접 프로퍼티 참조
: 언리얼 오브젝트를 만들 때 타입을 명시적으로 지정을 하는 방법 - 생성 시간 참조
: 강 참조 진행시 해당 오브젝트가 가리키고 있는 애셋을 생성자 코드로 생성하는 방법
(참고로, 생성자는 엔진 초기화시 실행되어서 게임이 실행되기 전에 에셋이 로딩)
(생성자가 엔진 초기화시 실행되어서 생성자를 고치면 에디터도 껐다 켜야한다고.. 했었지?)
약 참조
: 오브젝트 경로와 같은 문자열 형태와 같은 메커니즘을 통해 A가 B오브젝트를 참조
- 간접 프로퍼티 참조
: 함수나 포인터를 통해 경로를 가져와서 참조한다.
TSoftObjectPtr으로 LoadObject, StaticLoadObject실행 또는 FStreamingManagere 사용 - 오브젝트 검색, 로드
: FindObject( 생성 혹은 로드가 된 UObject만을 사용 ), LoadObject(로드가 안된 오브젝트를 패키지에 로딩후 사용)
애셋 스트링밍 관리자
: 애셋의 비동기 로딩을 지원하는 관리자(언리얼 엔진에서 제공) 객체
- FStreamableManager로 선언 (콘텐츠와 무관한 싱글톤 클래스)
- 이를 통해 동기, 비동기를 관리할 수 있음 + 다수의 경로를 통해 다수의 애셋을 로딩할 수 있음
동기 비동기 실습
1. 오브젝트 경로로 애셋 로딩
- MyGameInstance.h에 함수 선언후
- 261줄 : 에셋의 오브젝트 경로 설정
여기서는 {패키지이름}.{애셋이름} 으로 설정 - 264줄 : 정보 불러오기
2. 생성자에서 애셋 로딩
: 이 애셋은 게임이 실행되기 전에 미리 다 메모리에 올라와있어야한다.
- 24줄 : 에셋의 오브젝트 경로 설정
- 27줄 : 애셋 로딩
여기서 주목할 점은
- 다른 Log보다 생성자에서 실행한 로그가 가장먼저 나왔다.
- Log함수는 1번 호출했는데 Log는 2번 찍혔다.
- 에디터가 실행(로딩)되는 과정에서 1번 호출
- 에디터에서 게임이 실행될 때, Constructor 관련 함수들이 자동으로 호출되어서 1번 호출
→ 따라서 생성자에서 애셋을 로딩하는 경우, 그 애셋은 반드시 있다는 가정하에 진행된다.
(애셋 삭제하면 오류남)
비동기 로딩
- 비동기 방식으로 애셋을 로딩하기 위한 객체를 선언해야한다.
- 59, 61줄 : StreamableManager와 핸들을 선언했다.
비동기 처리를 위해 init함수에 코드 작성
- 177줄 : 애셋의 오브젝트 경로 설정
- 180줄 : StreamableManager으로 Handle을 설정한다.
- 181줄 : 람다함수로 핸들을 참조하여 람다의 내부에서 사용할 수 있도록 한다.(람다함수의 캡쳐 기능)
- 183줄 : IsValid : 핸들이 유효한지 확인, HasLoadCompleted : 로딩이 다 끝났는지 확인
- 186줄 : 핸들을 통해 GetLoadedAsset함수로 형변환해서 객체를 가져온다.
'하고싶은거 > Unreal' 카테고리의 다른 글
Part1 15. 언리얼 빌드 시스템 (0) | 2024.03.16 |
---|---|
Part1 13. 언리얼 오브젝트 관리 : 직렬화 (0) | 2024.03.14 |
Part1 12. 언리얼 엔진 메모리 관리 (0) | 2024.03.13 |
Part1 11. 언리얼 컨테이너 라이브러리 UCL : UStruct, TMap (0) | 2024.03.11 |
Part1 10. 언리얼 컨테이너 라이브러리 UCL : TArray, TSet (1) | 2024.03.11 |
@ssIIIn :: 두 번째 저장공간
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!