본문으로 건너뛰기
Unreal Engine 모듈 · 플러그인 개발LESSON 27

Asset Registry와 에디터 자동 검사 도구

난이도심화
예상 시간165분
선수지식26강의 Data Validation

27강. Asset Registry와 에디터 자동 검사 도구

1. 이번 강의에서 해결할 문제​

/Game 아래 모든 Package를 Load해 검사하면 Editor가 멈추고 메모리 사용량이 크게 증가합니다. 반대로 디스크 파일만 검색하면 Virtualized Asset, Redirector, Mount Point, 클래스 계층 정보를 정확히 다루기 어렵습니다. Unreal이 관리하는 Asset Registry를 먼저 질의해야 합니다.

2. 학습 목표​

3. 핵심 개념​

Asset Registry는 에셋을 Load하지 않고도 Package 경로, 클래스 경로, 태그 같은 메타데이터를 조회할 수 있게 합니다. 이름·경로·클래스 규칙은 AssetData만으로 검사하고, 객체 속성이 필요한 후보만 GetAsset()으로 로드합니다.

Editor 시작 직후에는 Registry 초기 수집이 끝나지 않았을 수 있습니다. 도구가 언제 실행 가능한지 표시하고 OnFilesLoaded 또는 현재 Scan 상태에 맞춰 갱신해야 합니다.

4. 단계별 실습​

Private/Audit/DataGuardAssetScanner.h
#pragma once

#include "AssetRegistry/AssetData.h"

struct FDataGuardIssue
{
FSoftObjectPath AssetPath;
FText Message;
};

class FDataGuardAssetScanner
{
public:
TArray<FDataGuardIssue> ScanBlueprintNames(
const FName RootPath,
const FString& RequiredPrefix) const;
};
Private/Audit/DataGuardAssetScanner.cpp
#include "Audit/DataGuardAssetScanner.h"

#include "AssetRegistry/AssetRegistryModule.h"
#include "Engine/Blueprint.h"
#include "Modules/ModuleManager.h"

TArray<FDataGuardIssue> FDataGuardAssetScanner::ScanBlueprintNames(
const FName RootPath,
const FString& RequiredPrefix) const
{
FAssetRegistryModule& RegistryModule =
FModuleManager::LoadModuleChecked<FAssetRegistryModule>(
"AssetRegistry");
IAssetRegistry& Registry = RegistryModule.Get();

FARFilter Filter;
Filter.PackagePaths.Add(RootPath);
Filter.ClassPaths.Add(UBlueprint::StaticClass()->GetClassPathName());
Filter.bRecursivePaths = true;
Filter.bRecursiveClasses = true;

TArray<FAssetData> Assets;
Registry.GetAssets(Filter, Assets);

TArray<FDataGuardIssue> Issues;
for (const FAssetData& Asset : Assets)
{
if (!Asset.AssetName.ToString().StartsWith(RequiredPrefix))
{
Issues.Add({
Asset.GetSoftObjectPath(),
FText::Format(
NSLOCTEXT(
"DataGuard",
"MissingPrefix",
"Expected prefix '{0}'."),
FText::FromString(RequiredPrefix))
});
}
}

return Issues;
}

목록에서 에셋을 선택할 때만 Content Browser를 동기화합니다.

이슈 선택 처리 예시
#include "ContentBrowserModule.h"
#include "IContentBrowserSingleton.h"

void SyncIssueToContentBrowser(const FDataGuardIssue& Issue)
{
const FAssetData AssetData =
FModuleManager::LoadModuleChecked<FAssetRegistryModule>(
"AssetRegistry")
.Get()
.GetAssetByObjectPath(Issue.AssetPath);

if (AssetData.IsValid())
{
TArray<FAssetData> Selection{AssetData};
FModuleManager::LoadModuleChecked<FContentBrowserModule>(
"ContentBrowser")
.Get()
.SyncBrowserToAssets(Selection);
}
}

ContentBrowser는 Editor 도구 Module의 Private Dependency입니다. 검색 결과 목록은 SListView<TSharedPtr<FDataGuardIssue>>로 구성하고 각 행에 에셋 경로와 텍스트 오류를 함께 표시합니다. 색상만으로 실패를 나타내지 않습니다.

5. 코드가 동작하는 이유​

Registry는 디스크의 모든 UObject를 메모리에 올리지 않고도 검색 가능한 인덱스를 제공합니다. Class Path와 Package Path를 서버 측 필터처럼 먼저 적용한 뒤 필요한 후보만 처리하므로 프로젝트 규모가 커져도 비용을 통제할 수 있습니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

Asset Registry와 에디터 자동 검사 도구 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Asset Registry와 에디터 자동 검사 도구” 내용을 실제 작업에 적용한 설명으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘초기 Scan 전 빈 결과를 성공으로 표시’ 상태에 관한 “Asset Registry와 에디터 자동 검사 도구” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

27강. Asset Registry와 에디터 자동 검사 도구 미완료 상태