반응형
비동기 로딩이 진행되는 동안 사용자에게 진행 상황을 보여주는 로딩 화면(UI) 구현과 에셋을 그룹 단위로 관리하는 에셋 매니저(Asset Manager)의 번들(Bundle) 기능에 대해 설명해 드릴게요.
비동기 로딩과 UI 연동 (진척도 표시)
비동기 로딩을 요청하면 TSharedPtr<FStreamableHandle>이라는 핸들을 반환받습니다. 이 핸들을 통해 현재 로딩이 얼마나 진행되었는지 확인할 수 있습니다.
[C++ 예시: 진척도 확인]
// 1. 로드 요청 시 핸들을 보관합니다.
TSharedPtr<FStreamableHandle> LoadHandle;
void AMyGameMode::StartLoading(TArray<FSoftObjectPath> AssetsToLoad)
{
FStreamableManager& Loader = UAssetManager::GetStreamableManager();
// 핸들을 저장하여 상태를 추적합니다.
LoadHandle = Loader.RequestAsyncLoad(AssetsToLoad, FStreamableDelegate::CreateUObject(this, &AMyGameMode::OnLoadFinished));
}
void AMyGameMode::Tick(float DeltaTime)
{
if (LoadHandle.IsValid() && LoadHandle->IsLoadingInProgress())
{
// 2. 0.0 ~ 1.0 사이의 진행률을 가져와 UI(ProgressBar)에 전달합니다.
float Progress = LoadHandle->GetProgress();
MyLoadingWidget->UpdateProgressBar(Progress);
}
}
에셋 매니저와 번들(Bundles) 활용
번들은 에셋들을 특정 상황(예: "Lobby", "InGame", "BossFight")에 맞춰 그룹화하는 기능입니다. 데이터 테이블 내의 TSoftObjectPtr에 번들 이름을 지정해두면, 에셋 매니저가 한 번에 해당 그룹을 로드하거나 해제할 수 있습니다.
[설계 방법]
- Primary Data Asset 사용: UPrimaryDataAsset을 상속받은 클래스를 만들고, 에셋 매니저에 등록합니다.
- 번들 태그 지정: UPROPERTY 메타데이터에 AssetBundles를 추가합니다.
UCLASS()
class UMyItemAsset : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
// 이 메쉬는 'Visual'이라는 번들 이름을 가집니다.
UPROPERTY(EditAnywhere, BlueprintReadWrite, AssetRegistrySearchable, meta = (AssetBundles = "Visual"))
TSoftObjectPtr<UStaticMesh> ItemMesh;
};
- 번들 단위 로드: 에셋 매니저의 LoadPrimaryAsset 함수를 호출할 때, 로드하고 싶은 번들 리스트(Visual)를 넘겨주면 해당 그룹의 소프트 포인터들만 한꺼번에 로드됩니다.
실무 로딩 화면 시퀀스
일반적으로 다음과 같은 순서로 로직을 구성합니다.
- UI 생성: 로딩 바가 있는 위젯을 화면에 띄웁니다.
- 로드 요청: 에셋 매니저에게 필요한 에셋(또는 번들) 로드를 요청하고 핸들을 받습니다.
- 상태 체크: Tick이나 Timer를 통해 핸들의 GetProgress()를 UI에 동기화합니다.
- 완료 콜백: 로드가 완료되면 핸들의 Delegate가 실행되고, 로딩 UI를 제거한 뒤 게임을 시작합니다.
주의할 점: 메모리 누수 방지
비동기 로드 핸들(FStreamableHandle)은 로드가 끝난 후에도 핸들을 명시적으로 해제(Release)하지 않으면 메모리에 해당 에셋들을 계속 붙잡고 있을 수 있습니다. TSharedPtr인 핸들이 유효 범위를 벗어나거나 수동으로 CancelHandle()을 호출하여 관리해야 합니다.
반응형
'게임 개발 > Unreal Engine 기본' 카테고리의 다른 글
| Unreal Engine의 Data Table과 TSoftObjectPtr 활용한 응 (1) | 2026.01.02 |
|---|---|
| Unreal Engine 비동기 로딩 (0) | 2026.01.02 |
| Unreal Engine의 TSoftObjectPtr 이란? (0) | 2026.01.02 |
| 블루프린트의 Construction Script(CS) 노드와 SCS (0) | 2025.12.30 |
| Unreal Engine SCS(Simple Construction Script) (0) | 2025.12.30 |